享元模式 - Flyweight
Flyweight(享元模式)
定义
GOF:运用共享技术有效地支持大量细粒度的对象。
GOF的定义比较专业化,通俗来说,当你有大量相似的实例时,你把其中相同的实例取出来共享。
例子
在你的游戏场景中,你需要用到多种地形,比如草地(Grass)、山脉(Hill)、河流(River)等,如下所示:
地形的类设计如下:
public class Terrain {
private Texture tex;
private int moveCost; //玩家移动速度损耗
public Terrain(Texture t, int mc) {
tex = t;
mc = moveCost;
}
}
很明显,同样类型地形的上述两个数据都是一样,如果像下面这样:
map[0,3] = new Terrain(GrassTex, 1);
map[1,0] = new Terrain(GrassTex, 1);
每个方格都创建一个新的实例,很明显是十分浪费内存的。更好的做法应该是:
Terrain grass = new Terrain(GrassTex, 1);
map[0,3] = grass;
map[1,0] = grass;
这样,我们就把一些相同的实例抽取了出来进行共享,降低了内存消耗。为了更好地管理这些地形实例,我们可以用一个单例的工厂类来进行管理:
public class TerrainFactory {
private TerrainFactory _Instance;
private TerrainFactory() {}
public Instance() {
//一些单例代码
}
private Hash<string, Terrain*> TerrainHash;
public Terrain* GetTerrain(string type) {
if(!TerrainHash.ContainKey(type))
return null;
return TerrainHash[type];
}
public void Add(string type, Terrain* terrain) {
if(!TerrainHash.ContainKey(type))
TerrainHash.Add(type, terrain);
}
}
这样我们就能这样使用了:
TerrainFactory factory = TerrainFactory.Instance();
factory.Add("Grass", new Terrain(GrassTex, 1));
factory.Add("River", new Terrain(RiverTex, 10));
factory.Add("Hill", new Terrain(HillTex, 5));
map[0,0] = factory.GetTerrain("Hill");
map[0,1] = factory.GetTerrain("River");
...
进一步
上面提到的例子是一个简化的版本,四人帮提出的版本要复杂一点,但是思想都是一样的。我们可以根据需要进行相应的修改。
参考
- Game Programming Patterns
- 大话设计模式
享元模式 - Flyweight的更多相关文章
- 二十四种设计模式:享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...
- 设计模式(十)享元模式Flyweight(结构型)
设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- 享元模式 FlyWeight 结构型 设计模式(十五)
享元模式(FlyWeight) “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...
- 享元模式-Flyweight(Java实现)
享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...
- Java享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)主要用于减少创建的对象数量,并减少内存占用并提高性能. 这种类型的设计模式属于结构模式,因为该模式提供了减少对象计数的方法,从而改善应用的对象结构. 享元 ...
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...
- 设计模式系列之享元模式(Flyweight Pattern)——实现对象的复用
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 享元模式/Flyweight模式/对象结构型/设计模式
flyweight 享元模式(对象结构型) Flyweight在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意 ...
随机推荐
- [Android] charles高级使用总结
reference to : http://blog.csdn.net/a910626/article/details/52823981 charles高级使用总结 网速模拟 点击菜单“Proxy→T ...
- 【转】Caffe初试(八)Blob,Layer和Net以及对应配置文件的编写
深度网络(net)是一个组合模型,它由许多相互连接的层(layers)组合而成.Caffe就是组建深度网络的这样一种工具,它按照一定的策略,一层一层的搭建出自己的模型.它将所有的信息数据定义为blob ...
- JAVA BigDecimal 小数点处理
1,保留两位小数 方法一:{ double c=3.154215; java.text.DecimalFormat myformat=new java.text.DecimalFormat(" ...
- php.ini 配置详解【转载】
[PHP]engine = On #是否启用PHP解析引擎zend.ze1_compatibility_mode = Off #是否在Last-Modified应答头中放置该PHP脚本的最后修改时 ...
- SimpleXML操控XML
复杂字符串如下: $_xml=<<<_xml <?xml version="1.0" encoding="utf-8"?> < ...
- brew 安装 mysql
在网上看到各种教程,都会出现ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.soc ...
- 在nginx中配置ip直接访问的默认站点
一台机子部署多个网站,我们直接访问ip (外网内网都一样)提示无法访问或404. 因为有多个网站,我们想指定某个网站为IP访问默认的网站,如何操作呢? 解:在Listen ip:port; 这个指令行 ...
- C++ 系列:深拷贝与浅拷贝
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- winform快速开发平台 -> 通用权限管理之动态菜单
这几个月一直忙APP的项目,没来得及更新项目,想想该抽出时间整理一下开发思路,跟大家分享,同时也希望得到宝贵的建议. 先说一下我们的权限管理的的设计思路,首先一个企业信息化管理系统一定会用到权限管理, ...
- CozyRSS开发记录17-Html2Xaml
CozyRSS开发记录17-Html2Xaml 1.RssContentView还需要优化 上回做了RssContentView的显示,但是对于rss返回的描述(摘要),连换行的没有,更别说里面还有h ...