Flyweight
1 意图:运用共享技术有效地大量支持细粒度的对象
2 动机:flyweight是一个共享对象,可以在多个场景使用。
分为内部状态和外部状态,内部状态存储于flyweight中,包含了独立于flyweight场景的信息,这些信息使得flyweight可以被共享。
外部状态取决于flyweight的场景。
3 适用性:
有效性取决于如何使用它以及在何处使用它。一下情况都成立时使用flyweight:
. 一个应用程序使用了大量的对象
. 完全由于使用大量的对象,造成了最大的存储开销
. 对象的大多数状态都可变为外部状态
. 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象
. 应用程序不依赖于对象标识。由于Flyweight对象可被共享,概念上明显有别的对象,标识测试将返回真值。
4 参与者:
. Flyweight:描述一个接口,通过接口flyweight可以接受并作用于外部状态
. ConcreteFlyweight:实现Flyweight接口,并为内部状态增加存储空间。ConcreteFlyweight对象必须可共享的。存储的状态必须是内部的。
. UnsharedConcreteFlyweight:并非所有的Flyweight子类都需要被共享。UnsharedConcreteFlyweight通常将ConcreteFlyweight作为子节点。Flyweight接口不强制共享。
. FlyweightFactory:创建并管理flyweight对象。确保合理的共享flyweight。
. Client:维护一个对flyweight的引用。计算或存储一个flyweight的外部状态。
5 协作:
. flyweight执行时所需要的状态必定是内部的或外部的。内部状态存储于ConcreteFlyweight对象之中,外部有Client存储或计算。当用户调用flyweight的操作时,将状态传递给它。
. 用户不应直接对ConcreteFlyweight进行实例化,只能从FlyweightFactory获得ConcreteFlyweight
6 效果:
存储节约:
. 因为共享,实例总数减少
. 对象内部状态的平均数目
. 外部状态是计算的还是存储的
和Composite模式结合使用,共享叶节点。但叶节点不能存储指向父节点的指针。
7 实现:
1)删除外部状态
2)管理共享对象
8 相关模式:
Flyweight通常和Composite结合使用。用共享叶节点的有向无环图实现逻辑上的层次结构
最好用Flyweight实现State和Strategy对象
Flyweight的更多相关文章
- Flyweight(享元模式)
import java.util.Hashtable; /** * 享元模式 * @author TMAC-J * 享元模式一般和工厂模式一起使用,但此处为了更好说明,只用享元模式 * 定义:享元模式 ...
- 设计模式(十二)享元模式(Flyweight Pattern)
一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...
- 享元模式 - Flyweight
Flyweight(享元模式) 定义 GOF:运用共享技术有效地支持大量细粒度的对象. GOF的定义比较专业化,通俗来说,当你有大量相似的实例时,你把其中相同的实例取出来共享. 例子 在你的游戏场景中 ...
- C#设计模式系列:享元模式(Flyweight)
当频繁地从数据源读取数据时,读出的内容存在重复,那么需要使用享元模式(Flyweight)来提高内存效率,Flyweight模式将节省更多空间,共享的Flyweight越多,空间节省越大. 1.享元模 ...
- 享元模式/Flyweight模式/对象结构型/设计模式
flyweight 享元模式(对象结构型) Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意 ...
- [工作中的设计模式]享元模式模式FlyWeight
一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...
- 享元模式(Flyweight Pattern)
一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...
- C++设计模式-Flyweight享元模式
Flyweight享元模式 作用:运用共享技术有效地支持大量细粒度的对象. 内部状态intrinsic和外部状态extrinsic: 1)Flyweight模式中,最重要的是将对象分解成intrins ...
- Flyweight(享元)--对象结构型模式
1.意图 运用共享技术有效地支持大量细粒度的对象. 2.动机 Flyweight模式描述了如何共享对象,使得可以细粒度地使用它们,而无需高昂的代价.flyweight是一个共享对象,它可以同时在多个场 ...
- 七个结构模式之享元模式(Flyweight Pattern)
定义: 运用共享技术对大量细粒度对象的复用,这要求这些对象都很相似,状态变化很小.将这些对象的内部状态和外部状态进行区分,对于内部状态相同的只存储一个对象,而对不同的外部状态则采用不同的操作. 结构图 ...
随机推荐
- JS 获取 地址栏 参数
法一:正则表达式 /** * 采用正则表达式获取地址栏参数: **/ var GetQueryString = function (name) { var reg = new RegExp(" ...
- Wordpress 标题设置
使用标题格式:首页(网站标题 - 网站副标题),其他页面(页面标题 | 网站标题) 在后台找到头部文件head.php <?php wp_title('|', true, 'right'); e ...
- SQLSERVER2012 附加数据库重名的问题
SQL2012附加数据库时如何更改数据库名称呢 方法一: 在“附加为”那一栏填写新的数据库名称就可以 方法二: 使用脚本 附加时点击脚本会自动生成附加脚本 直接修改database的名称即可!
- oracle从零开始学习笔记 二
多表查询 等值连接(Equijoin) select ename,empno,sal,emp.deptno from emp,dept where dept.deptno=emp.deptno; 非等 ...
- ionic卸载和更新
卸载 npm uninstall -g ionic 更新 npm update -g ionic
- android 自定义控件
学习参考:http://blog.csdn.net/hudashi/article/details/50913257 http://blog.csdn.net/gebitan505/article/d ...
- 调用java rest ful 接口实例
HttpWebRequest request = WebRequest.Create("http://192.168.0.99:8080/wzh-webservice/rest/login? ...
- [Android Tips] 18. Enable/Disable WiFi via adb
adb shell svc wifi enable|disable Awesome ADB
- DNS协议
DNS Message: Header 消息头部 Question DNS请求 Answer 回答请求的资源记录(Resource Record(s)) Authority 指向域的资 ...
- CEUtils---我在Unity中使用的一些小类库(不断更新中)
项目地址: http://git.oschina.net/eran/CEUtils