1. 定义
享元模式:使用共享对象可以有效地支持大量的细粒度的对象。
-
共享技术:防止对象分配过多而造成系统的性能问题,甚至OOM
-
细粒度:区分一个对象的内部状态和外部状态,通过外部状态唯一标识一个对象,防止重复对象更多
- 内部状态:可以共享的信息,存储在对象内部并且不会随环境改变
- 外部状态:不可以共享的信息,随着环境的改变而改变,是对象的索引值
2. 使用场景
- 系统中存在着大量相似的对象
- 细粒度的对象都具备外部状态和内部状态,外部状态不随环境而变化
- 需要缓冲池的场合
3. 实现
抽象与具体的享元角色如下:
public abstract class Flyweight {
//内部状态,可以共享的信息,存储在对象内部并且不会随环境改变
private String mIntrinsic;
//外部状态,不可以共享的信息,随着环境的改变而改变,是对象的索引值
protected final String mExtrinsic;
public Flyweight(String extrinsic) {
mExtrinsic = extrinsic;
}
}
public class ConcreteFlyweight extends Flyweight {
public ConcreteFlyweight(String extrinsic) {
super(extrinsic);
}
}
享元工厂如下:
public class FlyweightFactory {
//池容器
private static Map<String, Flyweight> sPool = new HashMap<>();
/**
* 通过外部状态结合池来管理对象
* @param extrinsic
* @return
*/
public static Flyweight getFlyweight(String extrinsic) {
Flyweight result = null;
if (sPool.containsKey(extrinsic)) {
result = sPool.get(extrinsic);
} else {
result = new ConcreteFlyweight(extrinsic);
sPool.put(extrinsic, result);
}
return result;
}
}
4. 优点
- 减少对象的创建,降低应用程序的内存占用,增强程序的性能,防止OOM
5. 缺点
- 为了实现共享,需要剥离对象的外部、内部状态,使得系统更加复杂
- 外部状态具有固化性,不随着环境、内部状态的变化而变化,否则共享池就会出现混乱
网友评论