.NET 设计模式—享元模式(Flyweight Pattern)

简介

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少系统中相似对象的内存占用或计算开销,通过共享相同的对象来达到节省资源的目的。

享元模式提供了一种高效地共享对象的方式,从而减少了内存占用和提高了性能,但需要注意的是,使用享元模式会增加系统的复杂性,因为它需要维护共享对象池。

角色

  • 抽象享元角色(IFlyweight):享元对象抽象基类或接口,同时定义出对象的外部状态和内部状态的接口或实现。
  • 具体享元角色(ConcreteFlyweight):实现抽象角色定义的业务。该角色的内部状态处理应该与环境无关,不会出现一个操作改变内部状态,同时修改了外部状态的情况。
  • 享元工厂(FlyweightFactory):负责管理享元对象池和创建享元对象。

优点

  • 大大减少对象的创建,降低系统的内存,使效率提高。

缺点

  • 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

应用场景

  • 大量相似对象:当一个应用程序需要创建大量相似的对象,而这些对象的区别仅在于它们的外部状态时,可以使用享元模式。通过共享内部状态,可以减少内存消耗,提高性能。
  • 内部状态和外部状态:如果一个对象的状态可以分为内部状态(可以共享)和外部状态(不可共享),那么可以使用享元模式。内部状态在对象内部管理,而外部状态在对象外部管理,根据需要传递给享元对象。
  • 缓存:享元模式可以用于实现缓存。例如,在计算密集型应用程序中,可以将计算结果缓存起来,以便在相同输入情况下可以重复使用。
  • 字形或图标管理:在图形处理软件中,字符、字形或图标通常是相似的,可以使用享元模式来共享它们的共同部分,减少内存占用。
  • 线程池:线程池可以使用享元模式来管理可重用的线程对象,减少线程的创建和销毁开销。
  • 游戏开发:在游戏开发中,可以使用享元模式来管理游戏中的角色、道具或粒子效果等。

实现

using System;
using System.Collections.Generic;public class FlyweightFactory
{private Dictionary<string, Flyweight> _flyweights = new Dictionary<string, Flyweight>();public Flyweight GetFlyweight(string key){if (!_flyweights.ContainsKey(key)){_flyweights.Add(key, new ConcreteFlyweight(key));}return _flyweights[key];}
}public abstract class Flyweight
{protected string _intrinsicState;protected Flyweight(string intrinsicState){this._intrinsicState = intrinsicState;}public abstract void Operation(int extrinsicState);
}public class ConcreteFlyweight : Flyweight
{public ConcreteFlyweight(string intrinsicState) : base(intrinsicState){}public override void Operation(int extrinsicState){// 具体操作实现Console.WriteLine($"Intrinsic State: {_intrinsicState}, Extrinsic State: {extrinsicState}");}
}// 使用
public class Program
{public static void Main(string[] args){FlyweightFactory factory = new FlyweightFactory();Flyweight flyweight1 = factory.GetFlyweight("A");flyweight1.Operation(2);Flyweight flyweight2 = factory.GetFlyweight("B");flyweight2.Operation(3);// 由于A已经存在,不会创建新的对象Flyweight flyweight3 = factory.GetFlyweight("A");flyweight3.Operation(4);}
}

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

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

相关文章

vue3-video-play 在安卓上正常播放,在ios上不能播放,问题解决

1.ios上autoplay需要静音&#xff0c;在播放后再打开声音 <vue3videoPlay v-if"!isComponent" v-bind"options" :playsinline"playsinline"></vue3videoPlay>let playsinline computed(() > {if (props.isComponent) {return}o…

【电路笔记】-异或门

异或门 文章目录 异或门1、概述2、数字逻辑异或门3、异或门等效电路异或逻辑函数是一个非常有用的电路,可用于许多不同类型的计算电路。 1、概述 异或门是算术运算中常用的另一种数字逻辑门,因为它可以用来给出两个二进制数的和以及错误检测和纠正电路。 在前面的文章中,我…

Photoshop 2023 中文---创意与设计的新篇章

Photoshop 2023是由Adobe Systems开发和发行的一款强大的图像处理软件&#xff0c;广泛应用于专业摄影师、设计师、艺术家等用户群体。它拥有丰富的功能和工具&#xff0c;可以轻松进行图像编辑、合成、调整和修复等任务。在Photoshop 2023中&#xff0c;智能选择功能得到了升级…

python爬虫-------urllib代理和代理池(第十七天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Kubernetes(k8s):深入理解k8s中的亲和性(Affinity)及其在集群调度中的应用

Kubernetes&#xff08;k8s&#xff09;&#xff1a;深入理解k8s中的亲和性&#xff08;Affinity&#xff09;及其在集群调度中的应用 1、什么是亲和性&#xff1f;2、节点亲和性&#xff08;Node Affinity&#xff09;2.1 硬性节点亲和性规则&#xff08;required&#xff09;…

paddle实现手写数字模型(一)

参考文档&#xff1a;paddle官网文档环境&#xff1a;Python 3.12.2 &#xff0c;pip 24.0 &#xff0c;paddlepaddle 2.6.0 python -m pip install paddlepaddle2.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple调试代码如下&#xff1a; LeNet.py import paddle import p…

013_NaN_in_Matlab中的非数与调试方法

Matlab中的非数与调试方法 是什么&#xff1f; Matlab编程&#xff08;计算器使用&#xff09;中经常有个错误给你&#xff0c;这句话里可能包含一个关键词NaN。大部分学生都有过被 NaN 支配的痛苦记忆。 NaN 是 Not a Number 的缩写&#xff0c;表示不是一个数字。在 Matla…

【SVN】clean up报错:Cleanup failed to process the following paths 解决方法

报错来源&#xff1a;代码更新有一个文件既不能接受自己的也不能接受别人的&#xff0c;只能取消&#xff0c;再提交提醒clean up&#xff0c;随后报标题错误。 解决方法&#xff1a;参考https://www.cnblogs.com/pinpin/p/11395438.html 注&#xff1a;如果clean up的时候有…

基于ssm项目校园快递平台系统

采用技术 基于SpringBoot框架实现的web的智慧社区系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 订单管理 快递管理 公告管理 公告类…

基于YOLOv5s的电动车入梯识别系统(数据集+权重+登录界面+GUI界面+mysql)

本人训练的yolov5s模型&#xff0c;准确率在98.6%左右&#xff0c;可准确完成电梯内检测电动车任务&#xff0c;并搭配了GUI检测界面&#xff0c;支持权重选择、图片检测、视频检测、摄像头检测、识别结果拍照和在线标注数据集等功能。 共有4000张左右图片&#xff0c;全部为电…

【ssh】群晖 ssh clone github 远程仓库

群晖 ssh clone github 远程仓库 终端 登录 群晖创建 rsa 密钥对 cd ~/.ssh ssh-keygen -t rsa -C "你的邮箱"查看并复制id_rsa.pub 公钥文件 把复制的内容提交至GitHub-setting-SSH and GPGkeys-Key中本地新建项目文件&#xff0c; 并clone git 代码项目 mkdir /…

机器人瓶胚检测工作站(H3U脉冲轴控制)

1、变量定义 2、程序监控1 2、 程序监控2 3、程序监控3 机器人输送料和机构的动作安全尤为重要&#xff0c;下面我们讨论下安全联锁控制逻辑

基于STM32F103单片机的时间同步项目

一、前言 本项目为前一个时间同步项目的更迭版本&#xff0c;由于之前的G031开发板没有外部晶振&#xff0c;从机守时能力几乎没有&#xff0c;5秒以上不同步从机时间就开始飞了。在考虑成本选型后&#xff0c;选择了带有外部有缘晶振的STM32F103C8T6最小单片机&#xff0c;来作…

解决mac本git安装后找不到命令的问题

不熟悉mac配置&#xff0c;折腾了半天&#xff0c;记录一下。 1.问题描述2.解决方法 1.问题描述 从https://sourceforge.net/projects/git-osx-installer/files/下载的git安装包&#xff1a; 安装时提示&#xff1a; 这里的解决办法是按住control键再打开文件安装。 安装完…

react antd 实现修改密码(原密码,新密码,再次输入新密码,新密码增加正则复杂度校验)

先看样子 组件代码&#xff1a; import React, { useState, useEffect } from react import { Row, Col, Modal, Spin, Input, Button, message, Form } from antd import { LockOutlined, EyeTwoTone, EyeInvisibleOutlined } from ant-design/icons import * as Serve from …

pyside6的QSpinBox自定义特性初步研究(二)

当前的需求是&#xff0c;蓝色背景的画面&#xff0c;需要一个相对应色系的QSpinBox部件。已有的部件风格是这样的&#xff0c;需要新的部件与之般配。 首先新建一个QDoubleSpinBox&#xff0c;并定义其背景色和边框&#xff1a; QDoubleSpinBox { color: white; border:1px…

基于无线物联网的智能配电监控系统设计应用

摘要&#xff1a;阐述基于电力物联网的智能配电监控系统的特点&#xff0c;探讨物联网结构及其关键技术&#xff0c;电力物联网下的智能配电监控系统设计&#xff0c;包括整体结构设计、硬件和软件系统设计。 安科瑞薛瑶瑶18701709087 关键词&#xff1a;电力物联网&#xff…

【好用】推荐10套后端管理系统前端模板

后台管理系统前端模板是开发者在构建后台管理系统时使用的一种工具&#xff0c;它提供了预先设计好的界面和组件&#xff0c;以帮助开发者快速搭建出功能完善、用户体验良好的管理系统。以下是V哥整理的10款流行的后台管理系统前端模板&#xff0c;它们基于不同的技术栈和设计理…

zookeeper分布式应用程序协调服务

一、zookeeper基本介绍 1.1 zookeeper的概念 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、…

[Python图像识别] 五十二.水书图像识别 (2)基于机器学习的濒危水书古文字识别研究

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。目前我进入第二阶段Python图像识别,该部分主要以目标检测、图像…