Version: Next

享元模式—— FlyWeight

源发问题

一个系统出现大量细粒度对象,这些细粒度对象会造成系统内存开销的浪费和对象维护的困难

解决方案

大量细粒度对象的状态都含有可变的外部状态,如果删除这些外部状态,系统中的对象数量就会变得很少。用相对较少的共享对象和外部状态对象的组合来取代大量的细粒度对象就是享元模式的基本思想,这里的共享对象就是享元。例如26个字母可以看成内部状态,而字母所在的行列、字体大小、颜色可以看成外部状态。

享元模式能做到共享的关键是区分内部状态和外部状态

  • 内部状态存储在享元内,不会随环境的改变而改变
  • 外部状态是随环境的改变而改变的,外部状态不能影响内部状态,它们是相互独立的。

UML类图

image-20200421212326493

FlyweightFactory享元工厂可以看作是一个池子,内部共享对象和外部对象都是由抽象类Flyweight派生的,池子里放了一堆Flyweight,客户端可以自由的对它们进行组合

享元模式相比装饰模式,可以处理更大规模的对象激增现象

代码

优缺点

  • 优点 可大大降低内存中对象的数量,或者在不降低对象数量的前提下降低内存的占用 外部状态可以存储也可以计算,如果采用计算的方式,对内存的节约效果更好
  • 缺点 模式允许客户端直接对具体类进行编程,这与开闭原则一定程度上相悖