设计模式之享元模式

享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度的对象,属于结构型模式。

程序设计中有时需要生成大量细粒度的实例来表示数据,如果这些实例除了少部分参数外都相同,可以将这部分参数移到实例外,调用方法时再传入,通过共享大幅减少实例数。

对象内共享的部分称为内部状态,随环境而变化、不可共享的部分称为外部状态。

组成

享元模式由抽象享元类(或接口)AbstractFlyweight,具体享元类 ConcreteFlyweight 和享元工厂 FlyweightFactory 组成。

其中 AbstractFlyweight 接受并作用于外部状态;ConcreteFlyweight 继承或实现 AbstractFlyweight,维护内部状态;FlyweightFactory 用于创建和管理 Flyweight 对象。

优点

通过共享大幅度减少实例的数目。

外部状态相对独立,而且不会影响其内部状态,使得享元对象可以在不同的环境中被共享。

缺点

使系统更加复杂,需要分离出内部状态和外部状态。

使用场景

系统中存在大量相同或者相似的对象,造成内存的大量耗费时可以使用享元模式。

设计原则

无。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public abstract class Website {
public abstract void use(String user);
}

public class ConcreteWebsite extends Website {

private String name;

public ConcreteWebsite(String name) {
this.name = name;
}

@Override
public void use(String user) {
System.out.println("网站:" + name + " 用户:" + user);
}
}

public class WebsiteFactory {

private HashMap<String, Website> websiteMap = new HashMap<>();

public Website getWebsite(String name) {
Website website = websiteMap.get(name);
if (Objects.nonNull(website)) {
return website;
}
Website newWebsite = new ConcreteWebsite(name);
websiteMap.put(name, newWebsite);
return newWebsite;
}

public int getWebsiteCount() {
return websiteMap.size();
}
}

public class Client {

public static void main(String[] args) {
WebsiteFactory websiteFactory = new WebsiteFactory();

Website blog1 = websiteFactory.getWebsite("blog");
blog1.use("小A");

Website blog2 = websiteFactory.getWebsite("blog");
blog2.use("小B");

Website blog3 = websiteFactory.getWebsite("blog");
blog3.use("小C");

Website shopping1 = websiteFactory.getWebsite("shopping");
shopping1.use("小D");

Website shopping2 = websiteFactory.getWebsite("shopping");
shopping2.use("小E");

Website shopping3 = websiteFactory.getWebsite("shopping");
shopping3.use("小F");

System.out.println("网站数量:" + websiteFactory.getWebsiteCount());
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2016-2020 姜越

谢谢老板

支付宝
微信