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)
定义: 运用共享技术对大量细粒度对象的复用,这要求这些对象都很相似,状态变化很小.将这些对象的内部状态和外部状态进行区分,对于内部状态相同的只存储一个对象,而对不同的外部状态则采用不同的操作. 结构图 ...
随机推荐
- Bomb---hdu5934(连通图 缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5934 题意:有n个炸弹,每个炸弹放在(x, y)这个位置,它能炸的范围是以 r 为半径的圆,手动引爆这 ...
- ORA-01436: 用户数据中的CONNECT BY 循环
起始地 目的地 距离(公里)A B 1000A C 1100A ...
- 【Apache】apache简单配置URL重写规则
[概述]URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程.举个例子来说,如果通过浏览器进来的URL是index.php?type=news&& ...
- java操作MySQL数据库(插入、删除、修改、查询、获取所有行数)
插播一段广告哈:我之前共享了两个自己写的小应用,见这篇博客百度地图开发的两个应用源码共享(Android版),没 想到有人找我来做毕设了,年前交付,时间不是很紧,大概了解了下就接下了,主要用到的就是和 ...
- linux--------wdcp中的各种坑。
1.刚买的空间客服给安装了wdcplinux,结果上去一看PHP是5.2版本的,这不是搞笑嘛.然后就有了下面的升级: 复制这条命令回车然后敲Y就可以: wget http://soft.itbulu. ...
- C#文件与流(FileStream、StreamWriter 、StreamReader 、File、FileInfo、Directory、directoryInfo、Path、Encoding)
(FileStream.StreamWriter .StreamReader .File.FileInfo.Directory.DirectoryInfo.Path.Encoding) C#文 ...
- Linux下执行的java命令重定向到文件中的方法
在Linux下通常会执行如:java -version 的命令, 但是,命令只是打印到了屏幕上不能重定向到文件中或标准输出流中. 此时需要将错误输出流重定向到标准输出流中就可以得到了. 比如:java ...
- BJFU 1068
描述 某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结 ...
- C#使用二叉树算法设计一个无限分级的树表
效果图: 数据库: 操作树的示意图: 控制器代码: using Dw.Business; using Dw.Entity; using Dw.Utilities; using System; usin ...
- easyui datagrid将表头的checkbox不显示(隐藏)
<script type="text/javascript"> $(function(){ $("#dg").datagrid({ url:&quo ...