• Flyweight


    1 意图:运用共享技术有效地大量支持细粒度的对象

    2 动机:flyweight是一个共享对象,可以在多个场景使用。

               分为内部状态和外部状态,内部状态存储于flyweight中,包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。

               外部状态取决于flyweight的场景。

    3 适用性:

       有效性取决于如何使用它以及在何处使用它。一下情况都成立时使用flyweight:

       . 一个应用程序使用了大量的对象

       . 完全由于使用大量的对象,造成了最大的存储开销

       . 对象的大多数状态都可变为外部状态

       . 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象

       . 应用程序不依赖于对象标识。由于Flyweight对象可被共享,概念上明显有别的对象,标识测试将返回真值。

    4 参与者:

      . Flyweight:描述一个接口,通过接口flyweight可以接受并作用于外部状态

      . ConcreteFlyweight:实现Flyweight接口,并为内部状态增加存储空间。ConcreteFlyweight对象必须可共享的。存储的状态必须是内部的。

      . UnsharedConcreteFlyweight:并非所有的Flyweight子类都需要被共享。UnsharedConcreteFlyweight通常将ConcreteFlyweight作为子节点。Flyweight接口不强制共享。

      . FlyweightFactory:创建并管理flyweight对象。确保合理的共享flyweight。

      . Client:维护一个对flyweight的引用。计算或存储一个flyweight的外部状态。

    5 协作:

       . flyweight执行时所需要的状态必定是内部的或外部的。内部状态存储于ConcreteFlyweight对象之中,外部有Client存储或计算。当用户调用flyweight的操作时,将状态传递给它。

       . 用户不应直接对ConcreteFlyweight进行实例化,只能从FlyweightFactory获得ConcreteFlyweight

    6 效果:

       存储节约:

       . 因为共享,实例总数减少

       . 对象内部状态的平均数目

       . 外部状态是计算的还是存储的

       和Composite模式结合使用,共享叶节点。但叶节点不能存储指向父节点的指针。

    7 实现:

       1)删除外部状态

       2)管理共享对象

    8 相关模式:

       Flyweight通常和Composite结合使用。用共享叶节点的有向无环图实现逻辑上的层次结构

       最好用Flyweight实现State和Strategy对象

  • 相关阅读:
    Apache与Nginx的优缺点比较
    [PHP基础]有关isset empty 函数的面试题
    PHP求解一个值是否为质数
    15个魔术方法的总结
    对象在类中的存储方式有哪些?
    cookie大小
    Tp3.2 和 Tp5.0之间的区别
    经典的面试题,(这是著名的约瑟夫环问题)
    怎么计算数据库有多大的数据量
    [置顶] 实用电子电路设计丛书
  • 原文地址:https://www.cnblogs.com/criticalsection/p/5725016.html
Copyright © 2020-2023  润新知