概述
- 定义:运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。
- 采用一个共享类来避免大量拥有相同内容的“小类”的开销。
- 内部状态:在享元对象内部不随外界环境改变而改变的部分,是可以共享的。
- 外部状态:随着环境的改变而改变,不能够共享的状态就是外部状态。
- 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式
- 是一种对象结构型模式。
- 学习难度:★★★★☆
- 使用频率:★☆☆☆☆
优缺点
- 优点
- 大大减少应用程序创建的对象实例
- 降低内存使用,提高性能
- 缺点
类图
组成角色
- 抽象享元角色(Flyweight)
- 具体享元角色(ConcreteFlyweight)
- 不可共享的享元角色(UnsharedConcreteFlyweight)
- 享元工厂(FlyweightFactory)
Code Example
抽象享元角色(Flyweight)
public interface FlyWeight {
void operation(int extrinsicState);
}
具体享元角色(ConcreteFlyweight)
public class ConcreteFlyWeight implements FlyWeight {
@Override
public void operation(int extrinsicState) {
System.out.println("具体FlyWeight:" + extrinsicState);
}
}
不可共享的享元角色(UnsharedConcreteFlyweight)
public class UnsharedConcreteFlyWeight implements FlyWeight {
@Override
public void operation(int extrinsicState) {
System.out.println("不共享的具体FlyWeight:" + extrinsicState);
}
}
享元工厂(FlyweightFactory)
public class FlyWeightFactory {
private Map<String, FlyWeight> flyWeights = new HashMap<String, FlyWeight>();
public FlyWeight getFlyWeight(String key) {
if (!flyWeights.containsKey(key)) {
flyWeights.put(key, new ConcreteFlyWeight());
}
return flyWeights.get(key);
}
}
客户端
public class FlyweightPattern {
public static void main(String[] args) {
int extrinsicState = 22;
FlyWeightFactory f = new FlyWeightFactory();
FlyWeight fx = f.getFlyWeight("X");
fx.operation(--extrinsicState);
FlyWeight fy = f.getFlyWeight("Y");
fy.operation(--extrinsicState);
FlyWeight fz = f.getFlyWeight("Z");
fz.operation(--extrinsicState);
FlyWeight uf = new UnsharedConcreteFlyWeight();
uf.operation(--extrinsicState);
}
}