• 学习设计模式之享元模式


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

    类结构图
    在这里插入图片描述
    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
    

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

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

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

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

  • 相关阅读:
    PHP如何解决网站大流量与高并发的问题
    HTML CSS 特殊字符表
    PHP 把返回的数据集转换成Tree树
    网页加载时域名加载数量限制
    关于浮点型误差的解决方法
    MVC三层架构
    MyBatis
    plsql储存过程
    游标和触发器
    使用plsql编程
  • 原文地址:https://www.cnblogs.com/liufeichn/p/11961633.html
Copyright © 2020-2023  润新知