设计模式-享元模式
享元模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
类图示例
举个例子
网站共享代码
代码实现
1 | import java.util.HashMap; |
类图
享元模式包含如下角色
- Flyweight (抽象元类)
抽象元类声明一个接口,通过它可以接受并作用于外部状态。在抽象元类中定义了具体元类公共的方法,这些方法可以向外界提供元对象的内部数据 (内部状态),同时也可以通过这些方法来设置外部数据 (外部状态)。 - ConcreteFlyweight (具体元类)
具体元类实现了抽象元接口,实例称为元对象;在具体元类中为内部状态提供了存储空间,由于具体元对象必须是可以共享的,因此它所存储的状态必须是内部的,即它独立存在于自己的环境中。可以结合单例模式来设计具体元类,为每一个具体元类提供唯一的元对象。 - UnsharedConcreteFlyweight (非共享具体元类)
并不是所有的抽象元类的子类都需要被共享,不能被共享的子类则设计为非共享具体元类;当需要一个非共享具体元类的对象时可以直接通过实例化创建;在某些享元模式的层次结构中,非共享具体元对象还可以将具体元对象作为子节点。 - FlyweightFactory (元工厂类)
元工厂类用于创建并管理元对象;它针对抽象元类编程,将各种类型的具体元对象存储在一个元池中,元池一般设计为一个存储键值对的集合 (也可以是其他集合类型),可以结合工厂模式进行设计;当用户请求一个具体元对象时,元工厂提供一个存储在元池中已创建的实例或者创建一个新的实例 (如果不存在的话),返回该新创建的实例并将其存储在元池中。
模式分析
- 优点
- 减少内存消耗:通过共享对象,减少了内存中对象的数量。
- 提高效率:减少了对象创建的时间,提高了系统效率。
- 缺点
- 增加系统复杂度:需要分离内部状态和外部状态,增加了设计和实现的复杂性。
- 线程安全问题:如果外部状态处理不当,可能会引起线程安全问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Lzh正在写代码!
评论