目录
什么是享元模式
将对象抽象成可变的内部状态和不可变的外部状态,通过共享对象中的外部状态,在使用时特定的修改内部状态。从而支持大量的细粒度对象,提升系统性能,避免内存溢出。
为什么要用享元模式
当需要生成大量重复相似的对象,而容易导致内存溢出时,可以考虑使用享元模式。
享元模式组成
抽象享元角色
public abstract class Flyweight {
//内部状态
private String intrinsic;
//外部状态
protected final String extrinsic;
public Flyweight(String extrinsic) {
this.extrinsic = extrinsic;
}
/**
* 业务操作
*/
public abstract void operate();
public String getIntrinsic() {
return intrinsic;
}
public void setIntrinsic(String intrinsic) {
this.intrinsic = intrinsic;
}
}
具体享元角色
public class ConcreteFlyweight extends Flyweight {
public ConcreteFlyweight(String extrinsic) {
super(extrinsic);
}
@Override
public void operate() {
System.out.println(String.format("extrinsic is %s",extrinsic));
}
}
享元工厂
public class FlyweightFactory {
private static Map<String, Flyweight> pool = new HashMap<>();
public static Flyweight getFlyweight(String extrinsic) {
Flyweight flyweight = null;
if (pool.containsKey(extrinsic)) {
flyweight = pool.get(extrinsic);
}
else {
flyweight = new ConcreteFlyweight(extrinsic);
pool.put(extrinsic, flyweight);
}
return flyweight;
}
}
测试驱动
public class Main {
public static void main(String[] args) {
Flyweight test = FlyweightFactory.getFlyweight("test");
test.operate();
}
}
注意几点
因为通过共享对象来避免创建大量的对象,所以对应多线程之间共享的线程安全问题需要自己注意并处理。