设计模式 | 享元模式

71 阅读1分钟

定义

使用共享对象可有效地支持大量的细粒度的对象。

使用场景

  • 系统中存在大量的相似对象。
  • 需要缓冲池。
  • 细粒度的对象都具备较接近的外部状态,且内部状态与环境无关。

Java 代码示例

public interface Flyweight {
    void doSomething();
}

public class ConcreteFlyweight implements Flyweight {
    private Object obj1;
    private Object obj2;
    private Object obj3;

    public ConcreteFlyweight(Object obj1, Object obj2) {
        this.obj1 = obj1;
        this.obj2 = obj2;
    }
    
    public Object getObj3() {
        return obj3;
    }

    public void setObj3(Object obj3) {
        this.obj3 = obj3;
    }

    @Override
    public void doSomething() {
    }
}

public class FlyweightFactory {
    private static Map<String, Flyweight> sFlyweightMap = new ConcurrentHashMap<>();

    public static Flyweight getFlyweight(Object arg1, Object arg2) {
        // key 代表对象的内部状态
        String key = arg1.toString() + arg2.toString();
        if (sFlyweightMap.containsKey(key)) {
            return sFlyweightMap.get(key);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(arg1, arg2);
            sFlyweightMap.put(key, flyweight);
            return flyweight;
        }
    }
}