【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()方法,现在要运用共享技术支 ...
随机推荐
- DAY1--JAVA
学习路线 2017-1-27打卡学习,先学习第一部分Java基础. 面向对象 面向对象---它是从现实世界中客观存在的事物(即对象)出发,并在系统构造中尽可能的运用人类自然的思维方式,来构建软件系统. ...
- android 如何画心
先前写了一个Windows版的画心,现在想把windows版的画心变成安卓版的. xml布局: <?xml version="1.0" encoding="utf- ...
- javascript高级程序设计第三章的一些笔记
[TOC] 1. 语法 1.1 区分大小写 变量.函数名和操作费都区分大小写. 1.2 标识符 标识符指变量.函数.属性的名字,或者函数的参数.标识符按以下规则组合: 第一个字符必须是一个字母,下划线 ...
- java:条件表达式
if (results.length() == 0) { return ""; } else { return results.substring(0, results.lengt ...
- 第4章 PCIe总线概述
随着现代处理器技术的发展,在互连领域中,使用高速差分总线替代并行总线是大势所趋.与单端并行信号相比,高速差分信号可以使用更高的时钟频率,从而使用更少的信号线,完成之前需要许多单端并行数据信号才能达到的 ...
- FusionCharts 2D帕累托图
1.了解帕累托图的特性以及和其他图的共性 2.设计帕累托图页面中引入图的类型以及怎么引入到页面 Pareto2D.html: <!DOCTYPE HTML PUBLIC "-//W3C ...
- freemarker自定义标签报错(六)
freemarker自定义标签 1.错误描述 freemarker.core.ParseException: Encountered "\"\u4f60\u597d\uff01\& ...
- 致IT同仁 — IT人士常犯的17个职场错误
记得刚参加工作时(那是97年),中国的IT刚刚兴起,那时,作为一个IT人士是一件很光荣的事,而那时的我正在做电气和电子相关的工作.99年第一次跳槽,进入了IT行业做软件开发.至今,中国的IT已经走过了 ...
- Caused by: java.lang.ClassNotFoundException: org.springframework.expression.ExpressionParser
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- JavaScript解决select下拉框中的内容太长显示不全的问题
JavaScript解决select下拉框中的内容太长显示不全的问题 1.说明 有些情况下,select下拉框的内容过长,导致部分看不见: 现在通过鼠标事件,让下拉框中的内容显示完全 2.实现源码 & ...