学习设计模式之享元模式

时间:2019-03-18
本文章向大家介绍学习设计模式之享元模式,主要包括学习设计模式之享元模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

享元模式
运用共享技术有效的支持大量细粒度的对象。

类结构图

FlyweightFactory
一个享元类,用来创建并管理 Flyweight 对象。它主要是用来确保合理地共享 Flyweight,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个已创建的实例。
Flyweight
所有具体享元类的超类或接口,通过这个接口,Flyweight 可以接受并作用于外部状态。
ConcreteFlyweight
实现了 Flyweight 超类或接口,并为内部状态增加存储空间。
UnsharedConcreteFlyweight
指那些不需要的共享的 Flyweight 子类。因为 Flyweight 接口共享成为可能,但它并不能强制共享。

代码示例

public interface Flyweight {
    void operation(int extrinsicState);
}

public class ConcreteFlyweight implements Flyweight {
    @Override
    public void operation(int extrinsicState) {
        System.out.println("具体的 Flyweight: " + extrinsicState);
    }
}

public class UnsharedConcreteFlyweight implements Flyweight {
    @Override
    public void operation(int extrinsicState) {
        System.out.println("不共享的具体 Flyweight: " + extrinsicState);
    }
}

public class FlyweightFactory {
    private Map<String, Flyweight> flyweightMap = new HashMap<>();

    public FlyweightFactory() {
        this.flyweightMap.put("X", new ConcreteFlyweight());
        this.flyweightMap.put("Y", new ConcreteFlyweight());
        this.flyweightMap.put("Z", new ConcreteFlyweight());
    }

    public Flyweight getFlyweight(String key) {
        return this.flyweightMap.get(key);
    }
}

客户端示例

public class FlyweightClient {
    public static void main(String[] args) {
        int extrinsicState = 22;
        FlyweightFactory factory = new FlyweightFactory();

        Flyweight fx = factory.getFlyweight("X");
        fx.operation(--extrinsicState);
        Flyweight fy = factory.getFlyweight("Y");
        fy.operation(--extrinsicState);
        Flyweight fz = factory.getFlyweight("Z");
        fz.operation(--extrinsicState);

        UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
        uf.operation(--extrinsicState);
    }
}

运行结果

具体的 Flyweight: 21
具体的 Flyweight: 20
具体的 Flyweight: 19
不共享的具体 Flyweight: 18

Process finished with exit code 0

内部状态与外部状态
在享元对象内部并且不会随着环境改变而改变的共享部分,可以成为享元对象的内部状态,而随着环境改变而改变的、不可以共享的状态就是外部状态。

使用场景
如果一个应用程序使用了大量的对象,而大量使的这些对象造成了很大的存储开销时就应该考虑使用;

优点
有效的降低系统中对象的实例数量,省资源。

缺点
使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。