享元模式

文章目录

  • 享元模式
    • 模式分类
    • 模式产生的原因
    • 模式类图
    • 代码实现
    • 享元模式的总结
      • 享元模式的优点:
      • 享元模式的缺点:

本篇博客将介绍享元模式,当系统中存在大量相同或者相似的对象时,我们就可以考虑使用享元模式。享元模式通过共享技术实现相同或者相似的细粒度对象的复用,从而节约内存空间,提高系统性能。在享元模式中会提供一个享元池用于存储已经创建好的享元对象。

模式分类

结构型设计模式。

模式产生的原因

如果一个软件系统在运行时所创建的相同或者相似的对象数量太多,将导致运行代价过高,带来系统资源的浪费、性能下降等问题。例如在一个文本字符串中存在许多相同的字符,如果每一个字符我们都用一个单独的对象来表示,这将会占用许多不必要的内存空间,如何避免系统中出现大量相同或者相似的对象,同时又不影响客户端程序对这些对象进行操作,享元模式就是为解决这一问题诞生的。

在享元模式中,存储这些享元对象的地方称为享元池,享元对象可以做到共享的关键原因在于享元对象区分了内部状态和外部状态。

内部状态就是存储在享元对象内部并且不会随着外部环境的变化而变化的状态,内部状态可以共享。

外部状态就是会随着环境的变化而变化,不能共享的状态,通常一个外部状态和其他外部状态是相互独立的。

模式类图

由上图可知经典享元模式主要有3个对象构成:

FlyWeight(抽象享元类):

通常是一个抽象类或者接口,在抽象享元类中声明了具体享元类中的公共方法,这些方法可以为外界提供内部状态和设置外部状态。

ConcreteFlyWeight(具体享元类):

实现了抽象享元类的类,通常可以结合单例模式来设计具体享元类,为每一个享元类提供唯一的享元对象。,当然也并不是所有的享元类都需要共享。

FlyWeightFactory(享元工厂):

享元工厂主要负责保存和创建享元对象,所有创建好的享元对象都保存在享元工厂中的享元池中。

代码实现

字体FlyWeight抽象类:

using System;namespace FlyWeight.FlyWeight.Question5
{public class FontFlyWeight{//享元对象标识,用于作为存入键值对中的键值public const string NAME = "";private char fontContent;public char FontContent{get => fontContent;set => fontContent = value;}public FontFlyWeight(char font){fontContent = font;}public string SetColor(string color){Console.WriteLine($"将当前字体{FontContent}的字体颜色设置为{color}");return color;}public string SetSize(string size){Console.WriteLine($"将当前字体{FontContent}的字体大小设置为{size}");return size;}}
}

字体享元工厂类:

using System.Collections.Generic;namespace FlyWeight.FlyWeight.Question5
{public class FontFactory{private static FontFactory m_instance;public static FontFactory GetInstance{get{if (m_instance == null){m_instance = new FontFactory();}return m_instance;}}private FontFactory(){AddFont(FontA.NAME, new FontA('a'));AddFont(FontB.NAME, new FontB('b'));}private Dictionary<string, FontFlyWeight> m_fontDic =new Dictionary<string, FontFlyWeight>();public void AddFont(string fontName, FontFlyWeight font){if (m_fontDic.ContainsKey(fontName)){m_fontDic[fontName] = font;}else{m_fontDic.Add(fontName, font);}}public FontFlyWeight FindFont(string fontName){if (m_fontDic.ContainsKey(fontName)){return m_fontDic[fontName];}return null;}public void RemoveFont(string fontName){if (m_fontDic.ContainsKey(fontName)){m_fontDic.Remove(fontName);}}}
}

字体享元实例:

namespace FlyWeight.FlyWeight.Question5
{public class FontB : FontFlyWeight{public new const string NAME = "FontB";public FontB(char font) : base(font){}}
}
namespace FlyWeight.FlyWeight.Question5
{public class FontA : FontFlyWeight{public new const string NAME = "FontA";public FontA(char font) : base(font){}}
}

Program运行:其中的a和b的内存地址是同一个。

using FlyWeight.FlyWeight.Question4;
using FlyWeight.FlyWeight.Question5;namespace FlyWeight
{internal class Program{public static void Main(string[] args){WebEquipmentFactory.GetInstance.AddWebEquipment(Switch.NAME, new Switch(Switch.NAME, 1));WebEquipmentFactory.GetInstance.FindWebEquipment(Switch.NAME).SetPort(pc1, new Port());WebEquipmentFactory.GetInstance.FindWebEquipment(Switch.NAME).SetPort(pc2, new Port());FontFlyWeight a, b;a = FontFactory.GetInstance.FindFont(FontA.NAME);a.SetColor("red");a.SetSize("80px");b = FontFactory.GetInstance.FindFont(FontB.NAME);b.SetColor("blue");b.SetSize("80px");}}
}

享元模式的总结

享元模式的优点:

  1. 享元模式而可以减少内存中对象的数量,是的相同或者相似的对象在内存中只保存一份。节约系统资源,提升系统性能。
  2. 在享元模式中,外部状态相对独立,而且不会影响到内部状态,从而可以使享元对象可以在不同的环境中共享。

享元模式的缺点:

  1. 享元模式会使系统变得复杂,需要区分内部状态和外部状态,使得程序的逻辑复杂化。
  2. 为了使对象可以共享,享元模式需要将对象的部分状态外部化,而读取外部状态需要额外的时间。

C#设计模式之享元模式相关推荐

  1. 北风设计模式课程---享元模式

    北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...

  2. 每天一个设计模式之享元模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  3. 北风设计模式课程---享元模式与单例模式区别

    北风设计模式课程---享元模式与单例模式区别 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式与单例模式区别? 级别:单例模式是类级别的,一个类 ...

  4. .net设计模式 (享元模式)学习笔记

    运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题  合理应用扬长避短 结构性设计模式:关注的是类与类之间的关系 .net设计模式 (享元模式)学习笔记 ...

  5. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  6. 详解设计模式:享元模式

    享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能.它提供了 ...

  7. 设计模式之享元模式详解

    设计模式之享元模式详解 概述 享元模式定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...

  8. 【设计模式】享元模式(C#)

    [设计模式]享元模式 1.概述 Flyweight Design Pattern,结构型模式.享元模式中的"享元"指被共享的单元.享元模式通过复用对象,以达到节省内存的目的. 用于 ...

  9. Java设计模式之享元模式

    Java设计模式之享元模式 1. 享元模式概述 1.1 享元定义 1.2 享元模式注意事项 2. 享元模式实现 1. 享元模式概述 1.1 享元定义 1)享元模式(享元模式)也叫蝇量模式:利用共享技术 ...

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

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

最新文章

  1. 在TensorFlow2.0发布前,帮你掌握TensorFlow的必备内容
  2. 后盾网lavarel视频项目---图片上传
  3. CUDA学习(六十三)
  4. oracle安装时配饰失败了,【求助】急!!!!oracle客户端安装时创建实例失败
  5. 【pytorch 】torchvision.transforms.CenterCrop==>从图像中心裁剪图片
  6. python模块:JSON模块
  7. 什么是Git最好的视觉合并工具? [关闭]
  8. python带cookie登录
  9. mpvue学习笔记-之微信数据请求封装
  10. 计算机组成原理问题集合
  11. 利用PPT要怎样绘制正弦曲线
  12. 望都墙绘 美丽乡村文化墙墙体彩绘
  13. php pdf文档内容修改,php2pdf-如何使用php修改pdf中的内容,并且保证格式不乱
  14. class.forName()详解
  15. mac os 苹果操作系统如何切换输入法
  16. ☀️光天化日学C语言☀️(07)- ASCII码 | 来,跟我念:阿斯克二马
  17. 百度搜索引擎爬行蜘蛛IP大全
  18. 今天你对我爱搭不理,明天我让你高攀不起
  19. php 获取百度权重,获取网站 百度权重 搜狗 谷歌PR
  20. 【Java定时任务】浅谈CronTrigger的用法和在线Cron表达式生成网址

热门文章

  1. Github网页创建分支,下载分支,删除分支
  2. JavaScript——数组——数组长度
  3. 【postgresql】SQL执行顺序
  4. 中忻嘉业科技:抖音电商与传统电商不同表现在哪些地方
  5. 《红楼梦》23道经典菜制作方法, 有原文,有出处(转)
  6. pygame clock.tick
  7. Velero备份恢复
  8. idea 怎么换主题,如何换主题颜色
  9. python控制投影仪的代码
  10. 最火的HTAP数据库 京东云新一代分布式数据库TiDB架构揭秘