文章目录
  1. 享元模式

享元模式

  • 运用共享技术有效地支持大量细粒度对象
    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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
public interface ColorFlyweight {
String getColorName();
void draw();
}
public class BaseColor implements ColorFlyweight {
private String name;
public BaseColor(String name) {
this.name = name;
}
@Override
public String getColorName() {
return name;
}
@Override
public void draw() {
System.out.println("Draw: "+name);
}
}
/**
* 复合的颜色,这些颜色由基础的颜色进行合成,复用率低,一般不需要共享
*/
public class CompositeColor implements ColorFlyweight{
Map<ColorFlyweight,Integer> colorPanel;
public CompositeColor(){
colorPanel=new HashMap<>();
}
public void add(ColorFlyweight color,Integer depth){
colorPanel.put(color,depth);
}
public void remove(ColorFlyweight color){
colorPanel.remove(color);
}
@Override
public String getColorName() {
List<String> colorNameList=new ArrayList<>();
colorPanel.forEach((color,depth)->{
colorNameList.add(color.getColorName()+"("+depth+")");
});
return String.join("-",colorNameList);
}
@Override
public void draw() {
List<String> colorNameList=new ArrayList<>();
colorPanel.forEach((color, depth) -> {
colorNameList.add(color.getColorName() + "(" + depth + ")");
});
System.out.println("Draw: " + String.join("-", colorNameList));
}
}
public class ColorFactory {
private static Map<String, ColorFlyweight> colors = new HashMap<>();
private static ColorFactory factory = new ColorFactory();
private ColorFactory() {
}
public static ColorFactory instance() {
return factory;
}
/**
* 模拟获取不同的基色
*/
public ColorFlyweight getBaseColor(String name) {
ColorFlyweight color = colors.get(name);
if (null == color) {
color = new BaseColor(name);
colors.put(name, color);
}
return color;
}
/**
* 模拟获取不同的混合颜色
*/
public ColorFlyweight getCompositeColor(String[] names, Integer[] depths) {
final CompositeColor color = new CompositeColor();
IntStream.range(0, names.length)
.forEach(idx -> color.add(getBaseColor(names[idx]), depths[idx]));
return color;
}
}
public class App {
public static void main(String[] args) {
ColorFlyweight red = ColorFactory.instance().getBaseColor("R");
red.draw();
ColorFlyweight green = ColorFactory.instance().getBaseColor("G");
green.draw();
ColorFlyweight blue = ColorFactory.instance().getBaseColor("B");
blue.draw();
String[] whiteColorArray = { "R", "G", "B" };
Integer[] whiteDepthArray = { 255, 255, 255 };
ColorFlyweight white = ColorFactory.instance()
.getCompositeColor(whiteColorArray, whiteDepthArray);
white.draw();
String[] blackColorArray = { "R", "G", "B" };
Integer[] blackDepthArray = { 0, 0, 0 };
ColorFlyweight black = ColorFactory.instance()
.getCompositeColor(blackColorArray, blackDepthArray);
black.draw();
}
}
文章目录
  1. 享元模式