设计模式之旅9--享元模式

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 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. 缺点

  • 为了实现共享,需要剥离对象的外部、内部状态,使得系统更加复杂
  • 外部状态具有固化性,不随着环境、内部状态的变化而变化,否则共享池就会出现混乱

你可能感兴趣的:(设计模式之旅9--享元模式)