享元模式
来源:互联网 发布:淘宝小米f码 编辑:程序博客网 时间:2024/05/22 08:19
在系统特定场景的系统中,包含大量的重复的实体。如棋类游戏中的棋子,大多形状/大小/都相同;又如游戏中,大量完全相同的小怪物,外观/基础属性等也完全相同。如果每个这种实体都完全对应一个对象,那么内存中将存储大量的重复数据,浪费了资源/降低了资源利用率。
享元模式就是为了解决这个问题,它将这类重复的、不变的小粒度实体,抽象成元对象,又称为享元。存储在享元池中,然后在需要使用享元的地方拿出来用,实现了复用。类似线程池的思想。这大大的节省了内存,而且对象重复率、重用率越高,效果越明显。例:
上例中,将字母作为享元,放在享元池中。使用时,再引用。
每个对象不可能全都具有完全的属性,例如上例中,每次引用时,字母的大小、颜色等都可能不同。享元模式能实现共享的前提是对享元状态的划分:内部状态、外部状态。
内部状态是享元内部的不会改变、可以共享的状态;
外部状态是可变的、不可共享的。
通过将具有相同内部状态的对象放到享元池,实现共享。使用时,再将外部状态注入。
定义 : 运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。
享元模式通常配合工厂模式使用,工厂作为享元的创建和管理者。
Flyweight为抽象享元类,工厂针对抽象享元编程。将各种类型的享元存储在享元池中。
内部状态作为成员封在享元内部,而外部状态通常通过方法参数的形式传到享元内部,供具体行为使用。
UnsharedConcreteFlyweoght为不可共享的实现,这也是常存在的。如果不存在,就称为单纯享元模式。
还有一种特殊的情况:复合享元模式
享元通过组合模式组成一个复合的享元,这个复合享元本身不可共享,但内部可拆为可共享的一个个享元。通过复合享元可以实现每个享元都具有相同的外部状态,如果希望一系列享元具有相同外部状态,可以使用复合享元。
享元模式可与工厂模式、单例模式、组合模式等一起使用。
总结:
优点:
- 复用对象,减少内存使用
- 系统变得复杂,逻辑繁琐
- 需要将实体抽象出内部状态和外部状态
- 大量重复对象,造成内存浪费
- 可变状态可以被外部化,并且不会带来太大的复杂性
1 0
- 深入浅出享元模式
- 享元模式
- 享元(FlyWeight)模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式Flyweight
- 享元模式
- 享元模式
- 享元模式
- FlyWeight 享元模式
- 享元模式(Flyweight)
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式 ---flyweight
- lua垃圾回收机制
- inline-block与float
- Dubbo原理及应用
- 内存分析工具 MAT 的使用
- 【Boost】boost库中智能指针——scoped_ptr
- 享元模式
- 5V供电Cortex-M微控制器
- 字符串
- 浅谈Javascript事件模拟
- rpm的常用参数
- 【Boost】boost库中智能指针——shared_ptr
- 在VS2013中利用SVN自动更新版本号
- (转)一个javap实例
- 菜单的打开闭合