享元模式 -- 大话设计模式
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
享元模式:运用共享技术有效地支持大量细粒度的对象,避免大量的相似对象的开销
程序设计中,有时需要大量细粒度的对象。如果能从这些对象中发现除了几个参数不同其他都是相同的话,可以通过将这些相同参数移到实例外,构建享元类,在方法调用时将具体对象传进来,来减少享元类被实例化的数目,减少系统消耗
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
享元模式 -- 大话设计模式相关推荐
- php实现享元模式,php设计模式 flyweight (享元模式)
25种php设计模式,你全都知道吗?下面用代码介绍享元模式(flyweight模式)<?php /** * 享元模式 * * 运用享元技术有效的支持大量细粒度的对象 */ class CD { ...
- python 享元模式_python 设计模式之享元(Flyweight)模式
#写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...
- python 享元模式_设计模式-创建型模式,python享元模式 、python单例模式(7)
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. 享元模式尝 ...
- Day314.外观模式享元模式 -Java设计模式
外观模式 外观类就是总控开关,去管理聚合的所有类 一.影院管理项目 组建一个家庭影院: DVD 播放器.投影仪.自动屏幕.环绕立体声.爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器:统 ...
- 【设计模式】享元模式 简介 ( 定义 | 对象池 | 内部状态 | 外部状态 | 适用场景 | 相关角色 )
文章目录 I . 享元模式 简介 II . 享元模式 内部状态 和 外部状态 III . 享元模式 适用场景 IV . 享元模式 优缺点 V . 享元模式 相关模式 VI . 享元模式 相关角色 I ...
- Java设计模式之结构型:享元模式
一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...
- 第11章 享元模式(Flyweight Pattern)
第11章 享元模式(Flyweight Pattern) 原文 第11章 享元模式(Flyweight Pattern) 概述: 面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题 ...
- 十一、享元模式——共享模式带来资源的节约
文章目录 享元模式 1.为什么使用享元模式 2.何时使用享元模式 3.Java中的享元模式 4.享元模式与多例工厂 5.实现一个享元模式 总结 设计模式是面向问题.场景而总结产生的设计思路.是解决问题 ...
- js享元模式设计原理以及应用案例
摘要 享元模式是用于性能优化的设计模式之一,在前端编程中有重要的应用,尤其是在大量渲染DOM的时候,使用享元模式及对象池技术能获得极大优化.本文介绍了享元模式的概念,并将其用于渲染大量列表数据的优化上 ...
最新文章
- Bloom Filter 大规模数据处理利器
- 【控制】《现代控制理论》谢克明老师-第3章-线性控制系统的能控性和能观测性
- 泊位调度问题 matlab,流水线车间调度问题matlab源程序.doc
- 使用Oracle验证外部数据
- golang的指针到string,string到指针的转换
- ES8新特性_async和await结合发送ajax请求---JavaScript_ECMAScript_ES6-ES11新特性工作笔记051
- 在python中查看关键字、需要执行,如何在一个文本文件,二进制执行搜索来搜索一个Python关键字?...
- 云服务如何对外开发指定端口
- java访问rabbitMQ 一
- js 获取元素文本_JS中获取元素属性的8大方法
- 基于卷积神经网络的人脸表情识别综述
- 斐讯K2路由器刷固件实现校园网可使用
- 关于Layer UI表格列日期格式化及取消自动填充日期
- 1.2、从“生日贺卡”看C++字符串的输入和输出
- HTTP传输协议详解(传输过程及数据格式详细)
- 做一个成功的软件项目经理
- Service Mesh实战
- 数据留存的计算-sql boy必备
- 每月一书(202107):《曾国藩的正面与侧面》
- 读书笔记||函数探幽
热门文章
- .NET中,字符串首字母大写的方法
- WCF分布式开发步步为赢(1):WCF分布式框架基础概念
- logo语言linux,用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息
- Redhat9安装firefox详解
- setup.py安装
- 烦死调参数-想设计一个自动调参机制
- 从源码分析DEARGUI之add_slider_float-4和add_slider_int-4
- 死磕 java同步系列之ReentrantReadWriteLock源码解析
- 解放程序员双手之Supervisor
- 3.6 迁移故障恢复