享元模式通过将对象的内部状态和外部状态分开,尽量共享内部状态来减少对象的创建。内部状态是对象可以共享的部分,而外部状态是对象特有的、依赖于环境的部分。
享元模式旨在有效共享对象,避免重复创建相同内容的对象,减少内存开销,让你能在有限的内存中载入更多对象。
享元类的状态只能由构造函数的参数进行一次性初始化,它不能对其他对象公开其设置器或公有成员变量。
享元模式只是一种优化。
享元模式在Java标准库中有很多使用,比如Byte、Integer。
享元模式是通过工厂方法创建对象,在工厂方法内部,很可能返回缓存的实例,而不是新创建实例,从而实现不可变实例的复用。
在实际应用中,享元模式主要应用于缓存,直接返回内存中缓存的数据。
当需要创建大量相似的对象时,且这些对象的内部状态有很多相同部分时,可以使用享元模式。
享元模式通常有以下组成部分:
- Flyweight(享元类):抽象享元类,负责存储共享的内部状态,定义接口以允许客户端访问内部状态。
- ConcreteFlyweight(具体享元类):具体的享元类,负责实现共享对象的操作,存储内部状态。
- FlyweightFactory(享元工厂):享元工厂类,用来管理和维护享元对象池。它确保享元对象的共享,避免重复创建相同对象。
- Client(客户端):使用享元对象的代码,负责传递外部状态,并将共享对象传递给其他对象进行操作。
假如开发一个文字编辑器,我们使用享元模式将相同字符的显示对象共享。
1、享元类