结构型: 享元模式

实现对象的复用

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。

享元模式中的几个角色:

  • Flyweight(抽象享元类)
    通常内部状态作为其成员变量,外部状态通过公共的方法进行设置。
  • ConcreteFlyweight(具体享元类)
    其实例称为享元对象,通常结合单例模式来设计。
  • UnsharedConcreteFlyweight(非共享具体享元类)
    当需要一个非共享具体享元类时可以直接通过实例化创建。
  • FlyweightFactory(享元工厂)
    享元工厂类用于创建并管理享元对象,存储在一个享元池中。
  1. 优点
    • 可以极大减少内存中对象的数量、
    • 享元对象的外部状态相对独立,不会影响其内部状态。
  2. 缺点
    • 系统设计更加复杂,需要分离内部状态和外部状态。
  3. 适用场景
    • 大量相似的对象。
    • 对象的大部分状态可以外部化。
    • 多次重复使用的享元对象时。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class FlyeightFactory {
private HashMap<String, Flyweight> flyweights = new HashMap<>();
public Flyweight getFlyweight(String key){
if (flyweights.containsKey(key)){
return flyweights.get(key);
}else {
Flyweight fw = new ConcreteFlyweight(key+"_state");
flyweights.put(key, fw);
return fw;
}
}
}
1
2
3
4
5
6
7
8
9
public abstract class Flyweight {
private String intrinsicState;
public Flyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
public abstract void operation(String extrinsicState);
}
1
2
3
4
5
6
7
8
9
10
11
public class ConcreteFlyweight extends Flyweight {
public ConcreteFlyweight(String intrinsicState) {
super(intrinsicState);
}
@Override
public void operation(String extrinsicState) {
}
}