【结构型】享元模式
定义
1
2
3
4
5
6
7
8
9
10
11
定义:利用共享技术有效地支持大量细粒度的对象。
在了解享元模式之前我们先要了解两个概念:
内部状态:在享元对象内部不随外界环境改变而改变的共享部分。
外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。
享元模式中的角色:
抽象享元类:所有具体享元类的超类或者接口,通过这个接口,Flyweight可以作用于外部
具体享元类:指定内部状态,为内部状态增加存储空间
非共享具体享元类:指出不需要共享的Flyweight子类
享元工厂类:用来创业并管理Flyweight对象,确保合理地共享Flyweight,当Client请求一个Flyweight时,工厂类就会提供一个Flyweight对象
UML图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
_ _ _ _ _ _
| |
| Client |
|_ _ _ _ _ _|
|
|
_ _ _↓_ _ _ _ _ _ _ _ _
| | | |
| Factory |----→| Component |
|_ _ _ _ _ _| |_ _ _ _ _ _|
↑ ↑
| |
| |
┌-----------┚ ┖--┐
| |
| |
| |
_ _ _ _ | _ _ _ _ _ _ _ _ |_ _ _ __ _ _ _ _ _ _
| ConcreteFlyweight | | UnsharedConcreteFlyweight |
|_ _ _ _ _ _ _ _ _ _| |_ _ _ _ _ _ _ _ _ _ _ _ _ _|
代码
1
2
3
4
public abstract class Shape{
public abstract void draw();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Circle extends Shape{
private String color;
public Circle(String color){
this.color = color;
}
public void draw(){
System.out.println("Draw a "+color+" circle.");
}
}
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
public class FlyweightFactory{
static Map<String,Shape> shapes = new HashMap<String,Shape>();
public static Shape getShape(String key){
Shape shape = shapes.get(key);
if(shape == null){
shape = new Circle(key);
shapes.put(key,shape);
}
return shape;
}
public static int getSum(){
return shapes.size();
}
}
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
public class Client{
public static void main(String[] args){
Shape shape1 = FlyweightFactory.getShape("Red");
shape1.draw();
Shape shape2 = FlyweightFactory.getShape("Blue");
shape2.draw();
System.out.println("We draw "+FlyweightFactory.getSum()+" kinds of circle.");
}
}
运行结果:
Draw a Red circle.
Draw a Blue circle.
We draw 2 kinds of circle.