【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()方法,现在要运用共享技术支 ...
随机推荐
- SpringBoot 中常用注解
本篇博文将介绍几种SpringBoot 中常用注解 其中,各注解的作用为: @PathVaribale 获取url中的数据 @RequestParam 获取请求参数的值 @GetMapping 组合注 ...
- dubbox系列【四】——使用dubbo-monitor-x监控注册中心
1.下载源码,编译成war包 源码下载地址为:https://git.oschina.net/yjmyzz/dubbo-monitor.git 在pom.xml文件所在目录,直接执行mvn packa ...
- EmguCV 绘画图形
1.Image类中绘图常用函数列表 实践验证 ///初始化图片 private void Form1_Load(object sender, EventArgs e) { oldpic = new E ...
- service不死之身
为了应用常驻后台,避免被第三方杀掉的方法 1)Service设置成START-STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样 2)通过startForegrou ...
- com.alibaba.druid.sql.parser.ParserException: syntax error, QUES %, pos 80 like报错解决
最近,把各应用的jdbc连接池统一从dbcp2改成了druid,运行时druid报sql解析错误,如下: select * from test where 1=1 &l ...
- Hive:子查询
Hive只支持在FROM子句中使用子查询,子查询必须有名字,并且列必须唯一:SELECT ... FROM(subquery) name ...
- sqoop:mysql和Hbase/Hive/Hdfs之间相互导入数据
1.安装sqoop 请参考http://www.cnblogs.com/Richardzhu/p/3322635.html 增加了SQOOP_HOME相关环境变量:source ~/.bashrc ...
- 在windows XP系统下编译和使用ffmpeg
最近在做流媒体开发这一块,在服务器端,所用的live555不支持mp4,avi等视频容器格式,所以打算运用ffmpeg来进行扩展.将MP4文件先运用ffmpeg进行解析,解析成live555所支持的基 ...
- NLP︱词向量经验总结(功能作用、高维可视化、R语言实现、大规模语料、延伸拓展)
R语言由于效率问题,实现自然语言处理的分析会受到一定的影响,如何提高效率以及提升词向量的精度是在当前软件环境下,比较需要解决的问题. 笔者认为还存在的问题有: 1.如何在R语言环境下,大规模语料提高运 ...
- php session函数
session_start() 开启session 使用session前需要使用该函数 session_id() 获取当前回话的sessionid session_save_path($path) 如 ...