在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……

享元模式:运用共享技术有效地支持大量细粒度的对象,避免大量的相似对象的开销

程序设计中,有时需要大量细粒度的对象。如果能从这些对象中发现除了几个参数不同其他都是相同的话,可以通过将这些相同参数移到实例外,构建享元类,在方法调用时将具体对象传进来,来减少享元类被实例化的数目,减少系统消耗

1.网页游戏刷屏怪物

  千万怪物灵魂,来到轮回工厂。工厂将灵魂放入生产线,赋予种族模板和皮肤模板(假设一款游戏,有3种怪物,每一种怪物样子都一样,boss和小怪只有皮肤颜色不同。如果怪物的属性是名字、样子和皮肤颜色,那么我们实例化一只怪物的时候,同时需要实例化一次样子和皮肤。数量少的话,还无所谓,一旦要实例化10W、100W只怪物的话,我们就需要实例化10W、100W次样子和皮肤,系统承担很大的内存消耗。通过观察,怪物的样子数量是固定的,皮肤颜色也是固定的,我们可以将这两个属性共享出去,这样实例化怪物的时候,就减少了样子和皮肤的实例化对象数量)

  定义享元类的超类或者接口,可以接受或者作用于外部状态

    /// <summary>/// 具体享元类的超类或者接口(可以接受或者作用于外部状态)/// </summary>public abstract class Flyweight{/// <summary>/// 颜色(内部状态)/// </summary>public string Colour { get; set; }/// <summary>/// 种类(内部状态)/// </summary>public string Kind { get; set; }/// <summary>/// 操作flyweight使用者/// </summary>/// <param name="name">flyweight使用者(外部状态)</param>public abstract void Operation(string obj);}

  定义怪物模型,具体的享元类,为内部状态增加存储空间

    /// <summary>/// 怪物模型类(具体享元类,为内部状态增加存储空间)/// </summary>public class MonsterModel : Flyweight{/// <summary>/// 给怪物灵魂赋予种族和皮肤/// </summary>/// <param name="obj">怪物灵魂</param>public override void Operation(string obj){Console.WriteLine("{0},系统大神赋予了我{1}种族的样子和{2}的皮肤,哇咔咔~我来了,菜鸟们~", obj, this.Kind, this.Colour);}}

  定义享元工厂,用来创建和管理享元对象。确保合理的共享享元对象,当用户请求一个享元对象时,工厂提供一个已创建的或者创建一个(如果不存在的话),这里可以同单例模式一起使用

    /// <summary>/// 享元工厂(用来创建和管理享元对象。确保合理的共享享元对象,当用户请求一个享元对象时,工厂提供一个已创建的实例或创建一个(如果不存在的话))/// </summary>public class FlyweightFactory{public Hashtable flyweights = new Hashtable();public FlyweightFactory(){flyweights.Add("白色史莱姆", new MonsterModel() { Kind = "史莱姆", Colour = "白色" });flyweights.Add("蓝色史莱姆", new MonsterModel() { Kind = "史莱姆", Colour = "蓝色" });flyweights.Add("紫色史莱姆", new MonsterModel() { Kind = "史莱姆", Colour = "紫色" });}public Flyweight GetFlyweight(string key){return (Flyweight)flyweights[key];}}

  开启场景模拟

        static void Main(string[] args){//千万怪物灵魂string model = "我是万千怪物灵魂中的{0}号";//来到轮回工厂FlyweightFactory factory = new FlyweightFactory();//工厂将灵魂放入生产线for (int n = 0; n < 10; n++){//赋予种族模板和皮肤模板factory.GetFlyweight("白色史莱姆").Operation(string.Format(model, n));}}

转载于:https://www.cnblogs.com/amywechat/p/4939505.html

享元模式 -- 大话设计模式相关推荐

  1. php实现享元模式,php设计模式 flyweight (享元模式)

    25种php设计模式,你全都知道吗?下面用代码介绍享元模式(flyweight模式)<?php /** * 享元模式 * * 运用享元技术有效的支持大量细粒度的对象 */ class CD { ...

  2. python 享元模式_python 设计模式之享元(Flyweight)模式

    #写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...

  3. python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...

  4. Day314.外观模式享元模式 -Java设计模式

    外观模式 外观类就是总控开关,去管理聚合的所有类 一.影院管理项目 组建一个家庭影院: DVD 播放器.投影仪.自动屏幕.环绕立体声.爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器:统 ...

  5. 【设计模式】享元模式 简介 ( 定义 | 对象池 | 内部状态 | 外部状态 | 适用场景 | 相关角色 )

    文章目录 I . 享元模式 简介 II . 享元模式 内部状态 和 外部状态 III . 享元模式 适用场景 IV . 享元模式 优缺点 V . 享元模式 相关模式 VI . 享元模式 相关角色 I ...

  6. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  7. 第11章 享元模式(Flyweight Pattern)

    第11章 享元模式(Flyweight Pattern) 原文 第11章 享元模式(Flyweight Pattern) 概述:   面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题 ...

  8. 十一、享元模式——共享模式带来资源的节约

    文章目录 享元模式 1.为什么使用享元模式 2.何时使用享元模式 3.Java中的享元模式 4.享元模式与多例工厂 5.实现一个享元模式 总结 设计模式是面向问题.场景而总结产生的设计思路.是解决问题 ...

  9. js享元模式设计原理以及应用案例

    摘要 享元模式是用于性能优化的设计模式之一,在前端编程中有重要的应用,尤其是在大量渲染DOM的时候,使用享元模式及对象池技术能获得极大优化.本文介绍了享元模式的概念,并将其用于渲染大量列表数据的优化上 ...

最新文章

  1. Bloom Filter 大规模数据处理利器
  2. 【控制】《现代控制理论》谢克明老师-第3章-线性控制系统的能控性和能观测性
  3. 泊位调度问题 matlab,流水线车间调度问题matlab源程序.doc
  4. 使用Oracle验证外部数据
  5. golang的指针到string,string到指针的转换
  6. ES8新特性_async和await结合发送ajax请求---JavaScript_ECMAScript_ES6-ES11新特性工作笔记051
  7. 在python中查看关键字、需要执行,如何在一个文本文件,二进制执行搜索来搜索一个Python关键字?...
  8. 云服务如何对外开发指定端口
  9. java访问rabbitMQ 一
  10. js 获取元素文本_JS中获取元素属性的8大方法
  11. 基于卷积神经网络的人脸表情识别综述
  12. 斐讯K2路由器刷固件实现校园网可使用
  13. 关于Layer UI表格列日期格式化及取消自动填充日期
  14. 1.2、从“生日贺卡”看C++字符串的输入和输出
  15. HTTP传输协议详解(传输过程及数据格式详细)
  16. 做一个成功的软件项目经理
  17. Service Mesh实战
  18. 数据留存的计算-sql boy必备
  19. 每月一书(202107):《曾国藩的正面与侧面》
  20. 读书笔记||函数探幽

热门文章

  1. .NET中,字符串首字母大写的方法
  2. WCF分布式开发步步为赢(1):WCF分布式框架基础概念
  3. logo语言linux,用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息
  4. Redhat9安装firefox详解
  5. setup.py安装
  6. 烦死调参数-想设计一个自动调参机制
  7. 从源码分析DEARGUI之add_slider_float-4和add_slider_int-4
  8. 死磕 java同步系列之ReentrantReadWriteLock源码解析
  9. 解放程序员双手之Supervisor
  10. 3.6 迁移故障恢复