定义:
运用共享技术对大量细粒度对象的复用,这要求这些对象都很相似,状态变化很小。将这些对象的内部状态和外部状态进行区分,对于内部状态相同的只存储一个对象,而对不同的外部状态则采用不同的操作。
结构图:
- Flyweight:抽象享元类,通常是一个接口或者是抽象类。其中定义了具体享元类的公用方法,包括向外提供内部状态数据展示的方法和设置外部数据状态。
- ConcreteFlyweight:具体享元类,实现了抽象享元类定义的方法,为内部状态提供了存储空间,并对外部状态作出交互。
- UnsharedConcrteFlyweight:非共享享元类,并不是所有抽象享元类都会被共享,不能被共享的子类可以设计为非共享具体享元类。
- FlyweightFactory:享元类工厂,一般都会采用工厂方法来配合享元类。享元工厂用于创建和管理享元对象,它将各种对象存储在一个享元池中,一般采用键值对的方式。
单纯享元模式和复合享元模式
- 单纯享元模式中,所有具体享元类都是可以共享的。
- 复合享元模式可以看做是享元模式和组合模式的一个结合,具体实现享元接口的复合享元类含有对抽象享元类的引用。复合享元模式可以用在一些享元类的外部状态都相同,而内部状态不同的情况。这样就不用重复实现具有相同外部状态的享元类,而是将这些享元类封装到一个复合享元类中,复合享元类的外部状态直接调用内部享元类的外部状态。具体结构图如下:
优点:
- 极大地减少内存中对象的个数,从而节约系统资源,提高系统性能。
- 享元的外部状态相对独立,而且不会影响到内部状态,从而使得享元可以在不同环境内被共享。
适用场景:
- 一个系统中含有大量相同或者相似的对象,造成内存的大量耗费。
- 对象的大部分状态都可以外化,可以将这些外部状态传入对象中。
实例: