Flyweight Pattern(享元模式) 上海

 Flyweight Pattern
  一,Define
        运用共享技术有效地支持大量细粒度的对象,系统只有使用少量的对象,而这些对象都很接近,状态变化很小。
      对系统是使用的次数增多。
 二,类和对象的关系
     1,Flyweight: 抽象轻量级类
       声明一个接口,通过它可以接受外来的参数(状态),并对新状态做出处理(作用)
     2,ConcreteFlyweight: 具体轻量级类
        实现Flyweight的接口,并为内部状态(如果有的话)增加存储空间,ConcreteFlyweight 对象必须是可以共享的,
          它所存储的状态必须是内部的,既它独立存在于自己的环境中。
     3,UnsharedConcreteFlyweight: 不共享具体轻量级类
           不是所有的Flyweight子类都需要被工享,Flyweight的工享不是强制的。在某些Flyweight的机构层次中,
            UnsharedConcreteFlyweight 对象通常将ConcreteFlyweight对象作为子节点
     4,FlyweightFactory: 轻量级工厂
             A:创建并管理Flyweight对象
             B:确保享用Flyweight.当用户请求一个Flyweight是,FlyweightFactory 提供一个已创建的实例或者创建一个实例(如果不存在)
    5,Client:  客户应用程序
             A:维持一个对Flyweight的运用
             B:计算或存储一个或多个Flyweight的外部状态。
    
       客户初次从轻量级工厂取Flyweight时,轻量级类工厂创建一个新的具体Flyweight对象,并且保存起来,下次客户取用时,就不用重新创建。
  直接在保存池中返回,客户负责处理Flyweight的状态。
   总结:Flyweight模式需要你认真考虑如何能细化对象,以减少处理的对象数量,从而减少存留对象在内存,然而,此模式需要维护大量的对象的外部状态,
如果外部状态的数据量大,传递,查找,计算这些数据会变的非常复杂。当外部和内部的状态很难分清时,不宜采用Flyweight
   推荐场景:
           1,系统需要存储在大量的对象而共享某些本质的,不边的信息。
           2,对象可以同时用于多个环境下。
           3,在每个实例下,Flyweight可以作为一个独立的对象。
原文地址:https://www.cnblogs.com/luozhai714/p/726425.html