享元模式

设计模式/结构型设计模式

简述

以共享的方式高效地支持大量细粒度对象的重用

UML图

代码

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

@Slf4j
public abstract class Bird implements Animal {
@Override
public void run() {
log.debug(“抽象鸟类—“);
}
}

@Slf4j
@Getter
public class Penguin extends Bird {
private String name; // 名字
@Setter
@Getter
private String color; // 颜色

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

@Override
public void run() {
log.debug("企鹅-- " + name + " " + color);
}
}

public class FlyweightFactory {

private static final HashMap<String, Bird> pool = new HashMap();

public static Bird getInstance(String name) {
Bird bird = null;
if (pool.containsKey(name)) {
bird = pool.get(name);
} else {
bird = new Penguin(name);
((Penguin) bird).setColor("黑色");
pool.put(name, bird);
}
return bird;
}

public static int size() {
return pool.size();
}
}

@Slf4j
public class Client {
public static void main(String[] args) {
Bird white = FlyweightFactory.getInstance(“penguin”);
((Penguin) white).setColor("白色");
Bird orange = FlyweightFactory.getInstance("penguin");
((Penguin) orange).setColor("橘色");
Bird king = FlyweightFactory.getInstance("king");
log.debug("size: " + FlyweightFactory.size());
}
}