文章目录

  • 享元模式
    • 结构
    • 实现
    • 应用场景
    • 利与弊

享元模式

享元模式是对象结构型模式,此模式为了处理大量的细粒度对象所导致的内存不足的解决方案。它通过运用共享技术来支持大量细粒度对象的复用,它通过共享已经存在的对象来大幅减少需要创建的对象数量(主要是内部状态的数量),从而避免大量的相似类的开销。

其中线程池,字符串池等,是最为常见的运用。在游戏开发中,我们需要对游戏中大量的对象的创建进行复用,其中包括粒子,模型等,大多数都是通过享元模式。这个模式对于游戏开发十分重要。

结构

说明

  • 抽象享元(Flyweight)- 定义子享元类的公有方法,且方法本身依赖于外部状态,通过参数进行数据交互。
  • 具体享元(Concrete Flyweight)- 实现具体方法,并将内部状态初始化。
  • 享元工厂(Flyweight Factory)- 负责创建和管理享元对象,本身可作为单例。
  • 外部状态(External State)- 享元对象需要的数据,但其本身会变化,将它以外部参数的形式传入,从而完成方法。

享元模式中,为了追求对象共享,我们将对象的信息分为两个部分

  • 内部状态 :指对象共享出来的部分,本身不会改变。
  • 外部状态:指对象中会随环境改变的变量,他们不存在享元对象中,而是通过参数传入。

实现

这里我们举一个游戏粒子的例子。

抽象粒子 - 抽象享元(定义内部状态)

    public abstract class ParticleFlyweight{protected readonly string _name;protected readonly float _size;protected readonly float _lifeTime;protected ParticleFlyweight(string name, float size, float lifeTime){_name = name;_size = size;_lifeTime = lifeTime;}public abstract void Release(ExternalStateParticle externalState);}

粒子1,2 - 具体享元

    public class Particle1 : ParticleFlyweight{public Particle1() : base("Particle1", 10f, 3f){}public override void Release(ExternalStateParticle externalState){Debug.Log(_name + "粒子,大小为" + _size + ",在" + externalState.Position + "位置,旋转为" + externalState.Quaternion + ",速度为" +externalState.Speed + ",生命周期为" + _lifeTime + ",释放");}}public class Particle2 : ParticleFlyweight{public Particle2() : base("Particle2", 5f, 5f){}public override void Release(ExternalStateParticle externalState){Debug.Log(_name + "粒子,大小为" + _size + ",在" + externalState.Position + "位置,旋转为" + externalState.Quaternion + ",速度为" +externalState.Speed + ",生命周期为" + _lifeTime + ",释放");}}

外部粒子 - 外部状态

    public struct ExternalStateParticle{public Vector3 Position;public Quaternion Quaternion;public float Speed;public ExternalStateParticle(Vector3 position, Quaternion quaternion, float speed){this.Position = position;this.Quaternion = quaternion;this.Speed = speed;}}

粒子工厂 - 享元工厂

    public class ParticleFactory{private Dictionary<string, ParticleFlyweight> _particle;private static ParticleFactory _instance = new ParticleFactory();public static ParticleFactory Instance => _instance;private ParticleFactory(){_particle = new Dictionary<string, ParticleFlyweight>();_particle.Add("1", new Particle1());_particle.Add("2", new Particle2());}public ParticleFlyweight GetParticleFlyweight(string key) =>key switch{"1" => _particle["1"],"2" => _particle["2"],_ => throw new ArgumentException("key 这个参数不存在"),};}

粒子 - (内部状态 + 外部状态 = 完整粒子)

    public class Particle{private ParticleFlyweight _internalState;private ExternalStateParticle _externalState;public Particle(ParticleFlyweight internalState, ExternalStateParticle externalState){_internalState = internalState;_externalState = externalState;}public void Release() => _internalState.Release(_externalState);}

调用

    public class FlyweightExample : MonoBehaviour{private void Start(){ParticleFlyweight internalState1 = ParticleFactory.Instance.GetParticleFlyweight("1");ParticleFlyweight internalState2 = ParticleFactory.Instance.GetParticleFlyweight("2");ExternalStateParticle externalState1 = new ExternalStateParticle(new Vector3(0f, 0f, 0f),new Quaternion(0f, 0f, 0f, 1),1.0f);ExternalStateParticle externalState2 = new ExternalStateParticle(new Vector3(0f, 0f, 0f),new Quaternion(0f, 0f, 0f, 1),2.0f);Particle particle1 = new Particle(internalState1, externalState1);Particle particle2 = new Particle(internalState2, externalState2);particle1.Release();particle2.Release();}}

应用场景

  • 当程序中存在大量的相似的对象时,即大量细粒度对象,为节约内存容量,应该使用享元模式。

利与弊

优点

  • 节约资源,避免创建大量的相同的对象数据。

缺点

  • 由于享元模式将原本完整的对象数据分成两部分,导致执行方法过程,每次都需传入数据,增加执行时间。
  • 容易使系统复杂。

享元模式 - Unity相关推荐

  1. Unity设计模式——享元模式(附代码)

    Unity设计模式--享元模式(附源码) 享元Flyweight模式是什么 享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的 ...

  2. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 【设计模式】享元模式

    上周代码评审,看到同事使用了"享元模式".想起自己也不懂,着手学习之. 参考的优秀的文章: Java的享元模式 这篇博文为学习之理解.感悟,如理解不真确,请慷慨指出. 本文只讨论单 ...

  4. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  5. 设计模式之享元模式、例子分析

    1. 定义 享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象 按我的理解来说,享元,就是共享单元,重复运用,这个模式的核心是复用代码,按不同需要,创建并共用一个实例(不同需要是共 ...

  6. 13Flyweight(享元)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Flyweight(享元)模式动机 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价--主要指 ...

  7. 享元模式 Flyweight Pattern

    享元模式的定义为:采用一个共享来避免大量拥有相同内容对象的开销. 这种开销中最常见.直观的就是内存的损耗.享元模式以共享的方式高效地支持大量的细粒度对象. 在名字和定义中都体现了共享这个核心概念,那么 ...

  8. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...

  9. 设计模式(享元模式)

    享元模式可以理解是一个对象的缓存,通过构建一个享元工厂对所有的对象进行管理. 代码如下: Flyweight 享元的接口 public interface Flyweight {public void ...

最新文章

  1. JSP、JAVA获取各种路径总结
  2. 正则表达式的深入理解
  3. 前天看了sigmastar新品发布,双核,1.2GHZ,真香!更多你想要了解的SSD201/202技术问题,看过来!启明云端MM帮你整理了!拿走不谢
  4. 新视窗java_《计算机组成原理实验》教学大纲 - 兰州大学信息科学与工程学院.DOC...
  5. python基础学习笔记(十二)
  6. MTK 驱动开发(34)---待机功耗调试
  7. Java套接字Socket编程--TCP参数
  8. Atlas客户端类库、控件介绍(2)
  9. 《寄生虫》横扫奥斯卡,Python告诉你这部电影到底好在哪儿?
  10. SQL中 decode()函数的应用和一些特殊的传值方法
  11. 太神了-图片可以转换成Word文档了
  12. 利用QGIS提取天地图矢量底图中的建筑模型边界线
  13. eureka多台注册中心_spring cloud eureka集群,注册中心再添加一台服务器
  14. 页面中插入视频的方法---video/embed/iframe总结
  15. VS2008 开发 Sharepoint Workflow 遇到的一些细节
  16. Sticky footer布局
  17. 超材料常用的仿真软件CST COMSOL HFSS指导实际操作
  18. 推荐一个免费超级好用的简历模板网站
  19. 计算机空格符号,电脑打印出现空格符号怎么办
  20. BO Session Kill

热门文章

  1. BZOJ 2095: [Poi2010]Bridges 混合图欧拉回路
  2. linux防火墙401,解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing...
  3. C++ 科学计数法和精度问题
  4. 用MATLAB画误差对比图
  5. UE中FRotator和Pitch(Roll,Yaw)以及相对朝向的关系
  6. icpc西部区域赛_ICPC西部区域赛捷报传来!
  7. 当前你所在的服务器更新维护尚未完成,我们将于01月16日09:00-13:00对所有服务器进行更...
  8. 如何在本地磁盘安装PE系统
  9. 异常检测之指数平滑(利用elasticsearch来实现)
  10. python数据本地保存_python保存数据到本地文件的方法