一 基本原理
参考:
5. 享元模式 — Graphic Design Patterns
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
享元模式包含如下角色:
- Flyweight: 抽象享元类
- ConcreteFlyweight: 具体享元类
- UnsharedConcreteFlyweight: 非共享具体享元类
- FlyweightFactory: 享元工厂类
概念:
内部状态:在享元模式中可以共享的相同内容称为内部状态(IntrinsicState)
外部状态:那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State)
代码:
//抽象享元类
public interface FlyWeight {
public void doFlyWeight();
}
//具体享元类
public class ConcreteFlyWeight implements FlyWeight{
private String string;
public ConcreteFlyWeight(String str) {
this.string = str;
}
@Override
public void doFlyWeight() {
}
}
//非共享具体享元类
public class UnSharedConcreteFlyWeight implements FlyWeight{
private String string;
public UnSharedConcreteFlyWeight(String str) {
this.string = str;
}
@Override
public void doFlyWeight() {
}
}
//享元工厂类
public class FlyWeightFactory {
private static HashMap<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;
}
}
二 使用
享元的核心思想其实就是“复用”,同时区分了外部状态和内部状态
现实例子:
Java中的线程池,
JDBC连接池等等,
String 常量池