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)的更多相关文章

  1. 设计模式-享元模式(FlyWeight)

    一.概念 享元模式是对象的结构模式,它以共享的方式高效的支持大量的细粒度对象,减少对象的数量,并达到节约内存的目的. 享元对象能够做到共享的关键,主要是区分了内部状态和外部状态,内部状态是对象是在建立 ...

  2. 设计模式--享元模式Flyweight(结构型)

    一.享元模式 在一个系统中如果有多个相同的对象,这些对象有部分状态是可以共享的,我们运用共享技术就能有效地支持大量细粒度的对象. 二.例子 举个围棋的例子,围棋的棋盘共有361格,即可放361个棋子. ...

  3. 大话设计模式--享元模式 Flyweight -- C++实现实例

    1. 享元模式: 运用共享技术有效地支持大量细粒度的对象. 享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生成大量颗粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都是相同的 ...

  4. 【Unity3D与23种设计模式】模板方法模式(Template Method)

    GoF中定义: "在一个操作方法中定义算法的流程,其中某些步骤由子类完成. 模板方法模式让子类在不变更原有算法流程的情况下,还能够重新定义其中的步骤" 每一次武器攻击目标时,都要按 ...

  5. 【Unity3D与23种设计模式】组合模式(Composite)

    前段时间在忙一个新项目 博客好久没有更新了 GoF中定义: "将对象以树状结构组合,用以表现部分-全体的层次关系.组合模式让客户端在操作各个对象或组合时是一致的." 是一致的意思就 ...

  6. 【Unity3D与23种设计模式】建造者模式(Builder)

    GoF中定义: "将一个复杂的构建流程与它的对象表现分离出来,让相同的构建流程可以产生不同的对象行为表现." 建造者模式可以分为两个步骤来实施: 1.将复杂的构建流程独立出来,并将 ...

  7. 【Unity3D与23种设计模式】策略模式(Strategy)

    GoF中定义: "定义一组算法,并封装每个算法,让它们之间可以彼此交换使用. 策略模式让这些算法在客户端使用它们时能更加独立." 游戏开发过程中 不同的角色会有不同的属性计算方法 ...

  8. 【Unity3D与23种设计模式】桥接模式(Bridge)

    GoF定义: "将抽象与实现分离,使二者可以独立的变化" 游戏中,经常有这么一种情况 基类角色类(ICharacter),下面有子类士兵类(ISoldier).敌军类(IEnemy ...

  9. 【Unity3D与23种设计模式】外观模式(Facade)

    GoF中定义: "为子系统定义一组统一的接口,这个高级的接口会让子系统更容易被使用" 其实这个模式虽然很少听过 但我们在敲代码的时候却是经常使用 比如: 在游戏初始化时 要初始化很 ...

  10. 二十四种设计模式:享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) 介绍运用共享技术有效地支持大量细粒度的对象. 示例有一个Message实体类,某些对象对它的操作有Insert()和Get()方法,现在要运用共享技术支 ...

随机推荐

  1. Yii小部件

    小部件 Yii提供了一套数据小部件widgets,这些小部件可以用于显示数据. DetailView小部件用于显示一条记录数据. ListView和GridView小部件能够用于显示一个拥有分页.排序 ...

  2. java打包项目将配置文件放在包外面(后续还会有补充)

    项目中也经常单独将一部分功能独立做Java Project,然后打成jar包供其他项目调用.如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采用jar包读取外 ...

  3. Docker系统五:Docker仓库

    创建Docker Hub账户 登录和上传镜像到Hub.docker.com docker login //登陆hub.docker.com docker tag ubutun1404-baseimag ...

  4. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 简介 这是一篇关于Redis使用的总结类型文章,会先简单的谈一下缓存 ...

  5. Java常见加密算法

    常见 package com.example.decript; import java.io.UnsupportedEncodingException; import java.security.In ...

  6. HDP2.0测试

    1.测试Hbase (1)hive导入hbase

  7. sqlserver中select造成死锁

    死锁过程: select语句使用非聚族索引查询产量信息,会对非聚族索引添加共享锁,由于非聚族索引上没有select的全部数据列,(所以会有书签查找出现,)需要查询产量表.查询产量表时,需要对产量表数据 ...

  8. 从零开始学习前端JAVASCRIPT — 12、JavaScript面向对象编程

    一.构造函数的使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. Flex中通过RadioButton进行切换

    1.页面切换 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx=& ...

  10. STL list 的insert()和erase()

    list 类提供了insert(),erase()函数,它们分别增加和删除一个位于迭代器位置的元素. 1,  insert() iterator insert(iterator pos,const T ...