【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()方法,现在要运用共享技术支 ...
随机推荐
- windows转mac-开发环境搭建(二):mac上java环境搭建
1.首先下载jdk,地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.安 ...
- the c programing language 学习过程7
interact 互动 carriage运费运输 linefeed 换行 redirection改方向 interleaved交叉存取 adequate足够的 untouched原样的 specif ...
- Pandoc将markdown转换为word
markdown转换为word的指令 直接将markdown转换为word pandoc -f markdown -t docx ./test.md -o test.docx 关于markdown转为 ...
- SpringBoot+Mybatis+PageHelper简化分页实现
前言 经过一段时间的测试和修改PageHelper插件逐渐走到了让我觉得靠谱的时候,它功能的就是简化分页的实现,让分页不需要麻烦的多写很多重复的代码. 已经加入我的github模版中:https:// ...
- MongoDB,子查询
//1.从sub(订单明细)对订单号分组,查询最多子订单的单号一条数据,重命名orderNo字段为num//2.根据这个sub.num(从结果集里获取第一条结果),查询main(主档表) db.mai ...
- Redis笔记5-redis高可用方案
一.哨兵机制 有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制.顾名思义,哨兵的含义就是监控redis系统的运行状态.可以启动多 ...
- ubuntu设置网络
二 .设置无线网络 1.首先确认一下你的无线驱动已经安装 方法一,查看一下ubuntu右上角的网络设置中有无线连接,如果有说明已经驱动了,ubuntu自带的就会驱动无线网卡. 方法二,iwconfig ...
- wpf通过VisualTreeHelper找到控件内所有CheckBox和TextBox并做相应绑定
#region CheckBox与TextBox绑定 Dictionary<CheckBox, TextBox> CheckTextBoxDic = new Dictionary<C ...
- jquery源码分析之一前言篇
1.问:jquery源码分析的版本是什么? 答:v3.2.1 2.问:为什么要分析jquery源码? 答:javascript是一切js框架的基础,jquery.es6.vue.angular.rea ...
- <CEPH中国-深圳站-技术交流会演讲PPT> YY云平台Ceph Block应用实践 & 我写的书 《CEPH实战》
YY云平台Ceph Block应用实践 http://s3.yyclouds.com/public/YY%E4%BA%91%E5%B9%B3%E5%8F%B0Ceph%E5%AE%9E%E8%B7%B ...