当频繁地从数据源读取数据时,读出的内容存在重复,那么需要使用享元模式(Flyweight)来提高内存效率,Flyweight模式将节省更多空间,共享的Flyweight越多,空间节省越大。

1、享元模式简介

1.1>、定义

  享元模式(Flyweight)的存在是为了避免大量拥有相同内容的小类的开销(如内存开销),使大家共享一个类。

1.2>、使用频率

   

2、享元模式结构

2.1>、结构图

2.2>、参与者

  享元模式参与者:

  ◊ Flyweight:声明一个接口,通过这个接口flyweight可以直接接收并作用于外部状态。

  ◊ ConcreteFlyweight:实现Flyweight接口,并为内部状态增加存储空间。ConcreteFlyweight对象必须是可以共享的,它所存储的状态必须是内部的,即它必须独立于ConcreteFlyweight对象的场景。

  ◊ UnsharedConcreteFlyweight:并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。

  ◊ FlyweightFactory

    ° 创建和管理flyweight对象。

    ° 确保flyweight对象被合理共享。当Client请求一个flyweight对象时,FlyweightFactory需要可以进行分配,若flyweight对象不存在时,则先创建一个。

  ◊ Client:维持一个对Flyweight的引用

  在享元模式中,Client调用Flyweight下的ConcreteFlyweight,如果ConcreteFlyweight存在则调用成功;否则就调用FlyweightFactory生产所需要的继承Flyweight接口的ConcreteFlyweight,以供调用。

3、享元模式结构实现

  Flyweight.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace DesignPatterns.FlyweightPattern.Structural
{public abstract class Flyweight{public abstract void Operation(int extrinsicstate);}
}

  ConcreteFlyweight.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace DesignPatterns.FlyweightPattern.Structural
{public class ConcreteFlyweight : Flyweight{public override void Operation(int extrinsicstate){Console.WriteLine("ConcreteFlyweight: " + extrinsicstate);}}
}

  UnsharedConcreteFlyweight.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace DesignPatterns.FlyweightPattern.Structural
{public class UnsharedConcreteFlyweight : Flyweight{public override void Operation(int extrinsicstate){Console.WriteLine("UnsharedConcreteFlyweight: " + extrinsicstate);}}
}

  FlyweightFactory.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using System.Collections;namespace DesignPatterns.FlyweightPattern.Structural
{public class FlyweightFactory{private Hashtable flyweights = new Hashtable();public FlyweightFactory(){flyweights.Add("X", new ConcreteFlyweight());flyweights.Add("Y", new ConcreteFlyweight());flyweights.Add("Z", new ConcreteFlyweight());}public Flyweight GetFlyweight(string key){return ((Flyweight)flyweights[key]);}}
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using DesignPatterns.FlyweightPattern.Structural;namespace DesignPatterns.FlyweightPattern
{class Program{static void Main(string[] args){// Arbitrary extrinsic stateint extrinsicstate = 22;FlyweightFactory factory = new FlyweightFactory();// Work with different flyweight instancesFlyweight fx = factory.GetFlyweight("X");fx.Operation(--extrinsicstate);Flyweight fy = factory.GetFlyweight("Y");fy.Operation(--extrinsicstate);Flyweight fz = factory.GetFlyweight("Z");fz.Operation(--extrinsicstate);UnsharedConcreteFlyweight fu = new UnsharedConcreteFlyweight();fu.Operation(--extrinsicstate);}}
}

  运行输出:

ConcreteFlyweight: 21
ConcreteFlyweight: 20
ConcreteFlyweight: 19
UnsharedConcreteFlyweight: 18
请按任意键继续. . .

4、享元模式应用分析

  享元模式适用情形:

  ◊ 一个应用程序使用了大量的对象

  ◊ 完全由于使用大量的对象,造成很大的存储开销

  ◊ 对象的大多数状态都可变为外部状态

  ◊ 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象

  ◊ 应用程序不依赖对象标识

  享元模式特点:

  ◊ 享元模式的核心是把大量共享的对象收集在一起使用简单工厂模式进行管理,避免由于大量的小对象导致系统内存过度消耗。

  ◊ 享元当重复对象较多时有很好的空间复杂度,但在查找搜索上消耗了时间复杂度。

转载于:https://www.cnblogs.com/libingql/p/3635354.html

C#设计模式系列:享元模式(Flyweight)相关推荐

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

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

  2. 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  3. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  "享"取"共享"之意,"元"取"单元"之意. 意图 运用共享技术,有效的支持大量细粒度 ...

  4. 设计模式:享元(FlyWeight)模式

    设计模式:享元(FlyWeight)模式 一.前言     享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...

  5. 设计模式(十)享元模式Flyweight(结构型)

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  6. 设计模式(18):结构型-享元模式(Flyweight)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  7. java23设计模式---class10、享元模式(FlyWeight)

    文章目录 一.基本介绍 1.定义 2.优点 3.缺点 4.角色 1)抽象享元类 2)具体享元类 3)享元工厂类 4)组合享元类 5.内部状态和外部状态 二.应用情景 1.线程池 2.String 3. ...

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

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

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

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

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

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

最新文章

  1. 道路场景语义分割算法
  2. OpenCascade Primitives BRep-Cylinder
  3. 谁动了我的奶酪?--java实例初始化的顺序问题
  4. 写给大家看的机器学习书【Part1】什么是机器学习?机器学到的到底是什么?
  5. JS 简单实现公告消息自动逐条切换
  6. 全球及中国苯基异丙基聚二甲基硅氧烷市场需求调查与竞争格局策略报告2022版
  7. 用matlab交互式的选取图像特定区域数据
  8. php is_dir 判断是否存在这目录
  9. MANIFEST.MF和feature.xml版本控制规则
  10. putty连接linux上传python,通过PuTTY用于SSH的Python脚本
  11. 诗与远方:无题(二十六)- 曾经给一个妹子写的一首诗
  12. shell 学习之for语句
  13. (自动重命名论文)PaperDownloader (Chrome插件) + EndNote (附下载链接) + Zotero
  14. JVM堆内存设置调优
  15. 几点预防内存泄露的小建议
  16. win7设置护眼模式
  17. 打飞机小游戏html代码,JavaScript用200行代码制作打飞机小游戏
  18. Ubuntu中挂载使用nas服务器
  19. org.apache.jasper.JasperException: java.lang.NullPointerException 解决办法
  20. 阿里总参谋长曾鸣:区块链中没有绝对的“去中心化”

热门文章

  1. 应该增加黑样本还是白样本呢
  2. 数字新写法3_000_000,简单明了
  3. 动漫风html源码,CSS3动画制作一个卡通风格的404错误页面代码
  4. python还是hadoop_使用Python和Hadoop Streaming编写MapReduce
  5. python前端学习-----Flask进阶
  6. 到底是把甲方当爸爸还是当甲方爸爸
  7. 笔记-项目整体管理-项目管理计划
  8. HBase Shell常用的命令
  9. 创建Maven项目时实际使用JDK为1.8,该怎样修改其默认的JDK1.5
  10. SpringBoot开发第一个Web入门级应用(超详细)