享元模式 - 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在拳击比赛中指最轻量级,即"蝇量级"或"雨量级",这里选择使用"享元模式"的意 ...
随机推荐
- StringBuffer与StringBuilder的简单理解
联系:两者都适用于字符串的操作,都可以随便对字符串的内容进行变更操作,都继承至AbstractStringBuilder. 区别:StringBuffer是线程安全的,方法都加了synchronize ...
- C# ADO.net 数据库连接池
前一阵开发一套系统,同组的同事提供了一个数据库连接组件,是他自己封装的,使用了自定义的连接池,用着很是不爽,而且经常会因为程序不严谨的原因,导致连接池里的连接被用完,也导致其他错误,因此我想自己研究一 ...
- Dapper入门学习
今天了解并学习了下Dapper的用法,这里简单介绍下 1.安装Nuget Dapper Package包 2.代码 using (IDbConnection connection = new SqlC ...
- Python 实现Windows开机运行某软件
开机运行:随系统启动的应用程序,当系统启动之后会自动加载的应用 在注册表中添加启动项便可实现开机启动. 代码如下: # -*- coding:utf-8 -*- import win32api imp ...
- 一个简单的消息提示jquery插件
最近在工作中写了一个jquery插件,效果如下: 就是一个简单的提示消息的一个东西,支持最大化.最小化.关闭.自定义速度.自定义点击事件,数据有ajax请求和本地数据两种形式.还有不完善的地方,只做了 ...
- dir命令只显示文件名
dir /b 就是ls -f的效果 1057 -- FILE MAPPING_web_archive.7z 2007 多校模拟 - Google Search_web_archive.7z 2083 ...
- jq冒泡之——点击其他地方隐藏
e.stopPropagetion(); <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
- Windows - 性能监控之磁盘剩余空间大小警报
开始 -> 运行 -> 键入命令 perfmon.msc 数据收集器(Data Collector Sets) -> 用户自定义(User Defined)
- Qt实现端口扫描器
首先展示一下效果: 界面通过Qt设计师做出来的. 主要有两个类. 首先主函数: #include "mainwindow.h" #include <QApplication& ...
- BZOJ 4066 简单题 ——KD-Tree套替罪羊树
[题目分析] 直接x,y二维轮番划分,暴力即可. 套上替罪羊,打碎重构,对于时间复杂度有了保证. 写起来好麻烦,重构的技巧很棒! [代码] #include <cstdio> #inclu ...