享元模式

Posted by 石玉军 on 2018-07-26

享元模式:以共享的方式高效的支持大量的细粒度对象

我们以咖啡为例,一家咖啡店一天卖出几千杯咖啡其实这几千杯也不过是几十种口味。在Java中你觉得是new几千次咖啡好还是new几十次口味好呢?享元模式就是利用的这个原理来共享的变量了。

来看一下类图:

t

FlavorFactory:口味工厂,根据客户所需口味生产咖啡
Client:售货员,负责通知工厂生产咖啡,以及出售咖啡和统计销售情况
Coffee:咖啡接口
Flavor:咖啡口味,实现了咖啡接口,并且持有一个口味属性,记录此咖啡的口味。
来看一下代码

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
public interface Coffee {
public String getFlavor();
}

public class Flavor implements Coffee {
private String flavor;
Flavor(String flavor){
this.flavor=flavor;
}
@Override
public String getFlavor() {
return this.flavor;
}
}

public class FlavorFactory {
private Map<String,Coffee> flavorMap=new HashMap<>();

public Coffee getCoffee(String flavor) {
if(flavorMap.get(flavor)!=null){
flavorMap.put(flavor,new Flavor(flavor));
}
return flavorMap.get(flavor);
}
public int flavorNum(){
return flavorMap.size();
}
}

public class Client {
private int coffeeNum;
private FlavorFactory flavorFactory;
Client(FlavorFactory flavorFactory){
this.flavorFactory=flavorFactory;
}
public void sell(String flavor){
flavorFactory.getCoffee(flavor);
coffeeNum++;
}
public void statistics(){
System.out.println("共卖出咖啡"+coffeeNum+"杯");
System.out.println("共卖出风味"+flavorFactory.flavorNum()+"种");

}
}

其实大家看了代码就明白了享元模式的核心思想,那就是重复利用以及存在的对象