个人博客:打开链接
一、享元模式的定义
- FLYweight Pattern
- 池技术的重要实现方式
- Use sharing to support large numbers of finegrained objects officiently.(使用共享对象可有效地支持大量的细粒度的对象)
- 共享对象
- 细粒度对象
内部状态:可共享的信息–不会随环境的改变而改变的信息
外部状态:依赖的标记,随环境的变化而变化
二、享元模式的通用类图
- FLYweight:抽象享元角色【产品地抽象类:内部状态和外部状态】
- ConcreteFLYweight:具体享元角色【共享的享元角色】
- unharedConcreteFLYweight:具体的享元角色【不共享的享元角色】
- FLYweightFactory:享元工厂:职责非常简单,就是构造一个池容器,同时从容器中取出对象的方法
享元模式的关键在于共享技术,使得一些细粒度的对象 可以共享
三、通用代码展示
抽象享元角色:
public abstract class Flyweight {
// 内部状态
private String intrinsic;
// 外部状态
private String extrinsic;
// 要求享元元素角色必须接受外部状态
public Flyweight(String extrinsic) {
super();
this.extrinsic = extrinsic;
}
// 定义业务操作
public abstract void operate();
// 获取内部状态
public String getIntrinsic() {
return intrinsic;
}
// 设置内部状态
public void setIntrinsic(String intrinsic) {
this.intrinsic = intrinsic;
}
}
具体享元角色:
public class ConcreteFLYweight1 extends Flyweight {
// 接受外部状态
public ConcreteFLYweight1(String extrinsic) {
super(extrinsic);
}
// 根据外部状态进行逻辑处理
public void operate() {
// 业务逻辑
}
}
public class ConcreteFLYweight2 extends Flyweight {
// 接受外部状态
public ConcreteFLYweight2(String extrinsic) {
super(extrinsic);
}
// 根据外部状态进行逻辑处理
public void operate() {
// 业务逻辑
}
}
享元工厂:
public class FLYweightFactory {
// 定义一个池容器
private static HashMap<String, Flyweight> pool = new HashMap<String, Flyweight>();
// 享元工厂
public static Flyweight getFlyweight(String Extrinsic) {
// 需要返回的对象
Flyweight flyweight = null;
// 在池中没有该对象
if (!pool.containsKey(Extrinsic)) {
// 创建对象
flyweight = new ConcreteFLYweight1(Extrinsic);
// 加入池中
pool.put(Extrinsic, flyweight);
} else {
flyweight = pool.get(Extrinsic);
}
return flyweight;
}
}
四、享元模式的优点
- 简单–池技术
- 减少程序创建对象,共享某些数据
- 降低内存的占用
- 增强程序的性能
五、享元模式的缺点
- 增加了系统的复杂性
- 需要分离出内部和外部状态,而且外部状态有固化特性,不应该随着内部状态的改变而改变,否则导致逻辑混乱
六、享元模式的使用场景
- 系统中存在大量的相似的对象
- 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
- 需要缓冲池的场景