c#设计模式-结构型模式 之 享元模式

🚀简介

享元模式(Flyweight Pattern)是一种用于性能优化的模式,其核心是运用共享技术来有效支持大量细粒度的对象。享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时传递进来,就可以通过共享大幅度地减少单个实例的数目。

👻享元( Flyweight )模式中存在以下两种状态:
  1. 内部状态,即不会随着环境的改变而改变的可共享部分。
  2. 外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。

👻享元模式的主要有以下角色:

  1. 抽象享元角色(Flyweight):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)。
  2. 具体享元(Concrete Flyweight)角色 :它实现了抽象享元类,称为享元对象;在具体享元类中为内部状态提供了存储空间。通常我们可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。
  3. 非享元(Unsharable Flyweight)角色 :并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类;当需要一个非共享具体享元类的对象时可以直接通过实例化创建。
  4. 享元工厂(Flyweight Factory)角色 :负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。

🚀案例

🐤抽象享元对象

public interface IFlyweight
{void Operation(int extrinsicstate);
}

🐤具体享元

public class ConcreteFlyweight : IFlyweight
{public void Operation(int extrinsicstate){Console.WriteLine("具体Flyweight:" + extrinsicstate); }
}

🐤非享元

public class UnsharedConcreteFlyweight : IFlyweight
{public void Operation(int extrinsicstate){Console.WriteLine("不共享的具体Flyweight:" + extrinsicstate);}
}

🐤享元工厂

享元工厂负责创建和管理享元对象。

在这个工厂类中,有一个Hashtable类型的私有成员变量flyweights,它用于存储享元对象。在构造函数中,我们向这个Hashtable中添加了三个ConcreteFlyweight对象,并且为每一个对象指定了一个唯一的键值。然后,这个工厂类提供了一个GetFlyweight方法,这个方法接受一个字符串类型的键值作为参数,然后从Hashtable中取出对应的享元对象并返回。

所以,这段代码的主要作用就是创建和管理享元对象,当需要一个享元对象时,只需要调用GetFlyweight方法并传入对应的键值即可。这样就可以实现享元对象的共享,避免了大量相似对象的创建,从而节省了系统资源。

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 IFlyweight GetFlyweight(string key){return ((IFlyweight)flyweights[key]);}
}

🐳测试类

class MyClass
{public static void Main(string[] args){FlyweightFactory f = new FlyweightFactory();IFlyweight fx = f.GetFlyweight("X");fx.Operation(1);IFlyweight fy = f.GetFlyweight("Y");fy.Operation(2);IFlyweight fz = f.GetFlyweight("Z");fz.Operation(3);UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();uf.Operation(4);}
}

🐳运行结果

在这个案例中我们使用哈希表(Hashtable)来实现,创建一个哈希表并将对象放入其中。其中键是对象的外部状态,值是对应的享元对象。当需要使用对象时,可以从哈希表中获取已经创建的享元对象。

🚀优缺点

优点:
极大减少内存中相似或相同对象数量, 节约系统资源 ,提供系统性能
享元模式中的外部状态相对独立,且不影响内部状态
缺点:
为了使对象可以共享,需要将享元对象的部分状态外部化,分离内部状态和外部状态,使程序 逻辑复杂
使用场景:
一个系统有大量相同或者相似的对象,造成内存的大量耗费。
对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此,应
当在需要多次重复使用享元对象时才值得使用享元模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/92761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开泰坦陨落2找不到msvcp120.dll无法执行代码/msvcr120.dll丢失修复方法

msvcp120.dll 是 Windows 操作系统中的一个动态链接库文件,对于许多程序和游戏的运行起着至关重要的作用。然而,有时候我们可能会遇到 msvcp120.dll 丢失的情况,导致电脑出现各种问题。本文将详细介绍 msvcp120.dll 丢失的四种解决方法&#…

大数据-玩转数据-Flink SQL编程实战 (热门商品TOP N)

一、需求描述 每隔30min 统计最近 1hour的热门商品 top3, 并把统计的结果写入到mysql中。 二、需求分析 1.统计每个商品的点击量, 开窗2.分组窗口分组3.over窗口 三、需求实现 3.1、创建数据源示例 input/UserBehavior.csv 543462,1715,1464116,pv,1511658000 662867,22…

MySQL进阶_3.性能分析工具的使用

文章目录 第一节、数据库服务器的优化步骤第二节、查看系统性能参数第三节、 慢查询日志第四节、 查看 SQL 执行成本第五节、 分析查询语句:EXPLAIN 第一节、数据库服务器的优化步骤 当我们遇到数据库调优问题的时候,可以按照以下流程进行分析。整个流程…

Stm32_标准库_5_呼吸灯_按键控制

Stm32按键和输出差不多 PA1为LED供给正电,PB5放置按键,按键一端接PB5,另一端接负极 void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2总线连接着GPIOBGPIO_InitStructur.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructur.…

[SpringBoot] 8. aop 获取 request response

最近开发有一个需求需要在 aop 中获取request response ,搜索许久没有答案,故此记录📝~ aop 获取 package com.example.easy_im.aop;import com.example.easy_im.Context; import jakarta.servlet.http.HttpServletRequest; impo…

STL学习笔记之容器

首先我们要学习的是容器 第一个是容器的初始化&#xff08;构造方式&#xff09;有三种方式 分别是 第一种 int arr[]{1,2,3} vector<int> v1(arr,arr3) 即容器存放的种类和从另外一个数组去拷贝一段数据。 第二种 vector<int> v2(3,10); 第一个3是指存放…

【Linux进行时】进程地址空间

进程地址空间 例子引入&#xff1a; 我们在讲C语言的时候&#xff0c;老师给大家画过这样的空间布局图&#xff0c;但是我们对它不了解 我们写一个代码来验证Linux进程地址空间 #include<stdio.h> #include<assert.h> #include<unistd.h> int g_value100; …

MATLAB在逐渐被Python淘汰吗?

MATLAB和Python都是非常强大的编程工具&#xff0c;各有优势。以下是两段代码的对比&#xff1a; MATLAB代码&#xff1a; import numpy as np from scipy.linalg import eig# 定义一个矩阵A A np.array([[1, 2], [3, 4]])# 计算矩阵A的特征值和特征向量 D, V eig(A)# 输出…

Java基础---第十二篇

系列文章目录 文章目录 系列文章目录一、获取一个类Class对象的方式有哪些?二、ArrayList 和 LinkedList 的区别有哪些?三、用过 ArrayList 吗?说一下它有什么特点?一、获取一个类Class对象的方式有哪些? 搞清楚类对象和实例对象,但都是对象。 第一种:通过类对象的 get…

[机缘参悟-107] :一个IT人关于顺势而为的思考:顺势而为思想在股-市中的体现与应用

目录 前言&#xff1a; 一、顺势而为的核心思想 1.1 道家“顺势而为”的思想 1.2 佛家“顺势而为”的思想 1.3 儒家“顺势而为”的思想 1.4 无处不在的“势” 1.5 逆势而为的代价 二、顺势而为在股市中的应用 2.1 顺势而为的策略 2.2 在别人疯狂的时候悲观&#xff0…

【C++】多线程的学习笔记——白话文版(bushi

目录 为什么要使用多线程 例子 代码 结果 首先要先学的库——thread库 thread的简介 thread的具体使用方法 基本变量的定义 注意&#xff08;小重点&#xff09; join函数的解读&#xff08;重点&#xff09; detach函数的解读 注意 关于vector和thread是联合使用 …

Mac程序坞美化工具 uBar

uBar是一款为Mac用户设计的任务栏增强软件&#xff0c;它可以为您提供更高效和更个性化的任务管理体验。 以下是uBar的一些主要特点和功能&#xff1a; 更直观的任务管理&#xff1a;uBar改变了Mac上传统的任务栏设计&#xff0c;将所有打开的应用程序以类似于Windows任务栏的方…

学习开发一个RISC-V上的操作系统(汪辰老师) — 环境配置

前言 &#xff08;1&#xff09;此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 &#xff08;2&#xff09;该课程相关代码gitee链接&#xff1b; &#xff08;3&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;4&#xff09;在学习汪辰老…

计算机竞赛 深度学习疲劳检测 驾驶行为检测 - python opencv cnn

文章目录 0 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习加…

Guava限流器原理浅析

文章目录 基本知识限流器的类图使用示例 原理解析限流整体流程问题驱动1、限流器创建的时候会初始化令牌吗&#xff1f;2、令牌是如何放到桶里的&#xff1f;3、如果要获取的令牌数大于桶里的令牌数会怎么样4、令牌数量的更新会有并发问题吗 总结 实际工作中难免有限流的场景。…

c++模板小例子

需要注意的是&#xff0c;模板中函数或方法&#xff0c;要在类或头文件中实现。关键字typename 和class基本等同。构造类模板时&#xff0c;要指明模板参数类型&#xff0c;而函数模板则不用指明参数类型。 #pragma once#include <string.h>#include <windows.h>us…

2023/9/27 -- ARM

【汇编语言相关语法】 1.汇编语言的组成部分 1.伪操作&#xff1a;不参与程序的执行&#xff0c;但是用于告诉编译器程序该怎么编译 .text .global .end .if .else .endif .data2.汇编指令 编译器将一条汇编指令编译成一条机器码&#xff0c;在内存里一条指令占4字节内…

JavaWeb 学习笔记 10:Element

JavaWeb 学习笔记 10&#xff1a;Element Element 是一个基于 Vue 的前端组件框架&#xff0c;使用它可以快速构建美观的前端页面。 1.快速开始 创建一个简单的 JavaWeb 应用。 添加一个 Html 页面&#xff0c;并在<head>标签中加入 Element 和 Vue 的相关 js 引用&a…

C++学习笔记一: 变量和基本类型

本章讲解C内置的数据类型&#xff08;如&#xff1a;字符、整型、浮点数等&#xff09;和自定义数据类型的机制。下一章讲解C标准库里面定义的更加复杂的数据类型&#xff0c;比如可变长字符串和向量等。 1.基本内置类型 C内置的基本类型包括&#xff1a;算术类型和空类型。算…

进阶指针(四)—— 加强对指针,数组名,sizeof,strlen的理解

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 &#x1f388;推荐相关博文&#xff1a;进阶C语言&#xff08;一&#xff09;、进阶C语言&#xff08;二&#xff09;、进阶C语言&#xff08;三&#xff09; 进阶指针&#xff08;四&#x…