【Unity3D与23种设计模式】享元模式(Flyweight)
GoF中定义:
“使用共享的方式,让一大群小规模对象能更有效地运行”
享元模式一般应用在游戏角色属性设置上
游戏策划需要通过“公式计算”或者“实际测试”等方式找出最佳的游戏属性
因此,在游戏系统中建立一个管理方式来建立和存储属性信息就显得尤为重要
对象中那些只能读取不能写入的共享部分被称为“内在状态”
如:最大生命(MaxHP)、移动速度(MoveSpeed)等属性
还有不能被共享的部分,被称为“外部状态”
如:当前生命(NowHP)、等级(LV)等属性
享元模式提供的解决方案是:
产生对象时,将能够共享的“内在状态”加以管理
并且将属于各对象能自由更改的“外部状态”也一起设置给新产生的对象中
//可以被共享的Flyweight接口
public abstract class Flyweight {
protected string m_Count; public Flyweight() { } public Flyweight(string Content)
{
m_Count = Content;
} public string GetContent() {
return m_Count;
} public abstract void Opreator();
}
//共享的组件
public class ConcreteFlyweight : Flyweight {
public ConcreteFlyweight(string Content) : base(Content) { } public override void Opreator()
{
Debug.Log("ConcreteFlyweight.Content["+m_Count+"]");
}
}
//不共享的组件
public class UnsharedCoincreteFlyweight {
Flyweight m_Flyweight = null;
string m_UnsharedContent; public UnsharedCoincreteFlyweight(string Content) {
m_UnsharedContent = Content;
} public void SetFlyweight(Flyweight theFlyweight) {
m_Flyweight = theFlyweight;
} public void Operator() {
string Msg = string.Format("UnsharedCoincreteFlyweight.Content[{0}]",m_UnsharedContent); if (m_Flyweight != null)
Msg += "包含了:" + m_Flyweight.GetContent();
Debug.Log(Msg);
}
}
//产生Flyweight的工厂接口
public class FlyweightFactor {
Dictionary<string, Flyweight> m_Flyweights = new Dictionary<string, Flyweight>(); public Flyweight GetFlyweight(string Key,string Content) {
if (m_Flyweights.ContainsKey(Key)) {
return m_Flyweights[Key];
} ConcreteFlyweight theFlyweight = new ConcreteFlyweight(Content); m_Flyweights[Key] = theFlyweight;
Debug.Log("New ConcreteFlyweight Key["+Key+"] Content["+ Content +"]");
return theFlyweight;
}
public UnsharedCoincreteFlyweight GetUnsharedFlyweight(string Content) {
return new UnsharedCoincreteFlyweight(Content);
} public UnsharedCoincreteFlyweight GetUnsharedFlyweight(string Key, string SharedContent, string UnsharedContent) {
Flyweight SharedFlyweight = GetFlyweight(Key,SharedContent); UnsharedCoincreteFlyweight theFlyweight = new UnsharedCoincreteFlyweight(UnsharedContent);
theFlyweight.SetFlyweight(SharedFlyweight);
return theFlyweight;
}
}
//测试类
void UnitTest() {
FlyweightFactor theFactory = new FlyweightFactor(); theFactory.GetFlyweight("","共享组件1");
theFactory.GetFlyweight("","共享组件2");
theFactory.GetFlyweight("","共享组件3");
}
//输出信息
New ConcreteFlyweight Key[] Content[共享组件1]
New ConcreteFlyweight Key[] Content[共享组件2]
New ConcreteFlyweight Key[] Content[共享组件3]
其他应用:
游戏中某些不断创建销毁的物体,如子弹
为了让游戏高效的管理这些数量庞大的物体
可使用享元模式来建立子弹对象池(Object Pool)
减少因为重复处理产生子弹对象、删除子弹对象所导致的性能损失。
文章整理自书籍《设计模式与游戏完美开发》 菜升达 著
【Unity3D与23种设计模式】享元模式(Flyweight)的更多相关文章
- 设计模式-享元模式(FlyWeight)
一.概念 享元模式是对象的结构模式,它以共享的方式高效的支持大量的细粒度对象,减少对象的数量,并达到节约内存的目的. 享元对象能够做到共享的关键,主要是区分了内部状态和外部状态,内部状态是对象是在建立 ...
- 设计模式--享元模式Flyweight(结构型)
一.享元模式 在一个系统中如果有多个相同的对象,这些对象有部分状态是可以共享的,我们运用共享技术就能有效地支持大量细粒度的对象. 二.例子 举个围棋的例子,围棋的棋盘共有361格,即可放361个棋子. ...
- 大话设计模式--享元模式 Flyweight -- C++实现实例
1. 享元模式: 运用共享技术有效地支持大量细粒度的对象. 享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生成大量颗粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都是相同的 ...
- 【Unity3D与23种设计模式】模板方法模式(Template Method)
GoF中定义: "在一个操作方法中定义算法的流程,其中某些步骤由子类完成. 模板方法模式让子类在不变更原有算法流程的情况下,还能够重新定义其中的步骤" 每一次武器攻击目标时,都要按 ...
- 【Unity3D与23种设计模式】组合模式(Composite)
前段时间在忙一个新项目 博客好久没有更新了 GoF中定义: "将对象以树状结构组合,用以表现部分-全体的层次关系.组合模式让客户端在操作各个对象或组合时是一致的." 是一致的意思就 ...
- 【Unity3D与23种设计模式】建造者模式(Builder)
GoF中定义: "将一个复杂的构建流程与它的对象表现分离出来,让相同的构建流程可以产生不同的对象行为表现." 建造者模式可以分为两个步骤来实施: 1.将复杂的构建流程独立出来,并将 ...
- 【Unity3D与23种设计模式】策略模式(Strategy)
GoF中定义: "定义一组算法,并封装每个算法,让它们之间可以彼此交换使用. 策略模式让这些算法在客户端使用它们时能更加独立." 游戏开发过程中 不同的角色会有不同的属性计算方法 ...
- 【Unity3D与23种设计模式】桥接模式(Bridge)
GoF定义: "将抽象与实现分离,使二者可以独立的变化" 游戏中,经常有这么一种情况 基类角色类(ICharacter),下面有子类士兵类(ISoldier).敌军类(IEnemy ...
- 【Unity3D与23种设计模式】外观模式(Facade)
GoF中定义: "为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用" 其实这个模式虽然很少听过 但我们在敲代码的时候却是经常使用 比如: 在游戏初始化时 要初始化很 ...
- 二十四种设计模式:享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...
随机推荐
- 史上最全的FTP网址
无帐号密码的为匿名登录 ftp://202.114.1.121 ftp://202.114.10.199 ftp://warez:cn.ftp@202.114.12.174 ftp://Music2: ...
- SpringMVC实现返回不同视图
在spring mvc中应该怎么实现可以返回不同结果呢,其实就是配置多个视图解析器,最常用的就是freemaker视图解析器,有时候要又要同时又jsp,html,那么应该怎么配置呢? 具体配置如下 & ...
- POJ - 3279 枚举 [kuangbin带你飞]专题一
这题很经典啊,以前也遇到过类似的题--计蒜客 硬币翻转. 不过这题不仅要求翻转次数最少,且翻转方案的字典序也要最小. 解法:二进制枚举第一行的翻转方案,然后处理第二行,如果第二行的k列的上一列是黑色, ...
- HDU - 1495 bfs [kuangbin带你飞]专题一
模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...
- Go基础之--操作Mysql(二)
在上一篇文章中主要整理了Golang连接mysql以及一些基本的操作,并进行了大概介绍,这篇文章对增删查改进行详细的整理 读取数据 在上一篇文章中整理查询数据的时候,使用了Query的方法查询,其实d ...
- PyQt5多点触控写字板实现及困惑
Qt支持程序多点触控,就想使用PyQt5做一个触控画板,经过几番周折,查阅了TouchEvent官方文档,又参考了一篇QT for Android的例子,采用eventfilter过滤器来识别触屏事件 ...
- 神经网络ANN——SPSS实现
神经网络[] 一.起源与历史 1.与传统统计方法的区别 传统线性回归模型可通过最小平方方法获取知识并在回归系数存储知识.在此意义下,其为神经网络.实际上,您可以证明线性回归为特定神经网络的特殊个案.但 ...
- org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir
1.错误描述 org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir svn: Co ...
- 用SpeedFan来控制CPU风扇转速
用SpeedFan来控制CPU风扇转速 浏览:63252 | 更新:2011-04-07 21:14 1 2 3 4 5 6 7 分步阅读 原创文章:看到SpeedFan,很多朋友最想要的是用Spee ...
- Django学习-4-request获取数据
app下views.py 获取前端HTML数据的一些方法 def func(request): # request.me ...