【搞懂设计模式】享元模式:共享节约,皆大欢喜!

什么是享元模式?

巧记:共享节约,皆大欢喜。

总结:享元模式是一种结构型设计模式,它通过共享技术有效地支持大量细粒度的对象。想象一个大家庭的餐桌,一顿饭需要的碗筷,如果每个人都自己带一套,那么需要的筷子和碗就会特别多,消耗的资源很大。但是如果大家都用公共的筷子和碗,就可以大大节省资源。这就是享元模式的原理。在计算机世界中,这种方式同样适用,尤其是在需要大量产生相同或相似对象的场景中,如线程池、连接池等,可以大大节约系统资源,提高效率。

享元模式是一种用于性能优化的模式,其核心思想是如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不需要为每一次使用都创建新的对象。

享元模式通过共享技术实现相同或相似对象的重用。 享元模式是结构型设计模式,它通过把内在状态(intrinsic state,相同部分)和外在状态(extrinsic state,不同部分)分离,通过共享创建实例,可以大幅度减少内存中对象的数量,从而达到节省内存的目的。 当一个程序使用了大量的对象,且大量的对象会导致很大的内存开销时,就可以考虑使用享元模式。

例子:围棋应用

假设我们是一个围棋应用的开发者,围棋中有黑白两色棋子,我们可以创建一个棋子的工厂,可以根据用户的需要给他们提供黑棋或者白棋,而无论多少用户,我们都只需要创建一个白棋和一个黑棋的实例就足够使用

package mainimport "fmt"// Color Type
type Color stringconst (White Color = "white"Black       = "black"
)// Piece Struct
type Piece struct {color Color
}// PieceFactory Struct
type PieceFactory struct {pieces map[Color]*Piece
}func (f *PieceFactory) GetPiece(color Color) *Piece {p, ok := f.pieces[color]if !ok {p = &Piece{color: color}f.pieces[color] = p}return p
}func NewPieceFactory() *PieceFactory {return &PieceFactory{pieces: make(map[Color]*Piece),}
}func main() {factory := NewPieceFactory()piece1 := factory.GetPiece(Black)fmt.Printf("Get piece: %v\n", piece1)piece2 := factory.GetPiece(White)fmt.Printf("Get piece: %v\n", piece2)piece3:= factory.GetPiece(Black)fmt.Printf("Get piece: %v\n", piece3)if piece1 == piece3 {fmt.Println("Same piece")} else {fmt.Println("Different piece")}
}

在这个例子中以看到,尽管用户调用了多次获取棋子的函数,但对同颜色的棋子,系统只创建了一个实例。

在享元模式中,有两种状态:

  1. 内部状态(Intrinsic State):在享元对象内部且不会随环境改变而改变的共享部分,例如我们棋盘游戏的黑白棋子之间的颜色。
  2. 外部状态(Extrinsic State):随环境改变而改变的、不可共享的状态,例如棋子的位置。

总结

总而言之,享元模式在如下场景中比较适用:

  • 一个应用使用了大量的对象。
  • 完全由于使用了大量的对象,造成很大的内存开销。
  • 对象的大多数状态都可以变为外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 程序设计得当,可以在运行时刻需要时新建对象。

如果上面的内容对你有帮助,请点赞收藏哦,我会分享更多的经验~

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

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

相关文章

暴力破解

暴力破解工具使用汇总 1.查看密码加密方式 在线网站:https://cmd5.com/ http://www.158566.com/ https://encode.chahuo.com/kali:hash-identifier2.hydra 用于各种服务的账号密码爆破:FTP/Mysql/SSH/RDP...常用参数 -l name 指定破解登录…

MAX27——处理max模型导出Zbrush中,无UV,或者UV炸开,反向等问题。

现在很多小伙伴要做数字人的时候会用到zbrush拓补高模。制作法线。有些人喜欢在zbrush中去做封套。也有喜欢直接用max做低模,做好的uv导入到Zbrush中,直接把高模法线,烘焙到低模UV的。这里主要讲解以下max导出到zbrush中,UV炸开&a…

SQL注入:报错注入

SQL注入系列文章:初识SQL注入-CSDN博客 SQL注入:联合查询的三个绕过技巧-CSDN博客 目录 什么是报错注入? 报错注入常用的3个函数 UpdateXML ExtractValue Floor rand(随机数) floor(向上取整&…

大模型日报-20240126

「think step by step」还不够,让模型「think more steps」更有用 https://mp.weixin.qq.com/s/3mdDYQI0WYgIpctyK6q2PA 如今,大型语言模型(LLM)及其高级提示策略的出现,标志着对语言模型的研究取得了重大进展&#x…

JavaScript 生成器(Generator)、高级 iteration用法详解

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ 目录 ✨ 前言 ✨ 正文 一、生成器(Generator) 什么是生成器 生成器函数 nex…

Unity 代理模式(实例详解)

文章目录 实例1:资源加载代理(Asset Loading Proxy)实例2:网络请求代理(Network Request Proxy)实例3:性能优化代理(Performance Optimization Proxy)实例4:权…

Docker容器部署OpenCV,打造高效可移植的计算机视觉开发环境

推荐 海鲸AI-ChatGPT4.0国内站点:https://www.atalk-ai.com 前言 在计算机视觉领域,快速部署和测试算法是研究和开发的关键。OpenCV作为一个强大的开源计算机视觉库,广泛应用于各种图像处理和视频分析任务。然而,配置OpenCV环境可…

光纤接口类型

光纤接口 网络设备基础知识 文章目录 光纤接口前言一、光纤接口二、光纤接口的优缺点总结前言 不同的接口类型适用于不同的光纤传输系统和应用需求。在选择光纤设备时,需要根据实际需求和系统要求选择适当的光纤接口类型。 一、光纤接口

计算机基础之微处理器简介

微处理器 微处理器定义 微型计算机的CPU也被称为微处理器,是将运算器、控制器和高速缓存集成在一起的超大规模集成电路芯片,是计算机的核心部件。能完成取指令、执行指令,以及与外界存储器和逻辑部件交换信息等操作。 微处理器发展 CPU从…

[C++]使用纯opencv部署yolov8旋转框目标检测

【官方框架地址】 https://github.com/ultralytics/ultralytics 【算法介绍】 YOLOv8是一种先进的对象检测算法,它通过单个神经网络实现了快速的物体检测。其中,旋转框检测是YOLOv8的一项重要特性,它可以有效地检测出不同方向和角度的物体。…

安全小记-ngnix负载均衡

目录 一.配置ngnix环境二.nginx负载均衡 一.配置ngnix环境 本次实验使用的是centos7,首先默认yum源已经配置好,没有配置好的自行访问阿里云镜像站 https://developer.aliyun.com/mirror/ 接着进行安装工作 1.首先创建Nginx的目录并进入: mkdir /soft &…

【七、centos要停止维护了,我选择Almalinux】

搜索镜像 https://developer.aliyun.com/mirror/?serviceTypemirror&tag%E7%B3%BB%E7%BB%9F&keywordalmalinux dvd是有界面操作的,minimal是最小化只有命里行 镜像下载地址 安装和centos基本一样的,操作命令也是一样的,有需要我…

openlayers+vue实现缓冲区

文章目录 前言一、准备二、初始化地图1、创建一个地图容器2、引入必须的类库3、地图初始化4、给地图增加底图 三、创建缓冲区1、引入需要的工具类库2、绘制方法 四、完整代码总结 前言 缓冲区是地理空间目标的一种影响范围或服务范围,是对选中的一组或一类地图要素(点、线或面…

C++面试:散列表

目录 1. 散列表的基本概念 散列表的定义 散列函数 哈希冲突 2. 处理冲突的方法 链地址法(Separate Chaining) 开放地址法 再散列 3. 散列表的性能分析 1. 平均查找长度(ASL) 2. 负载因子(Load Factor&#…

【Linux】-cp模型

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

IS-IS:04 DIS

IS-IS 协议只支持两种网络类型,即广播网络和点到点网络。与 OSPF 协议相同, IS-IS 协议在广播网络中会将网络视为一个伪节点 ( Pesudonde,简称 PSN),并选举出一台DIS (Designated IS&#xff09…

ASP.NET Core 7 Web 使用Session

ASP.NET Core 好像不能像20年前那样直接使用Session函数,我使用如下方法 1、在NuGet安装以下2个包 2、在Program.cs注册 //注册Session builder.Services.AddSession(options > {options.IdleTimeout TimeSpan.FromMinutes(60);options.Cookie.HttpOnly fals…

CAN相关寄存器

1. CAN_ MCR:CAN主控制寄存器。主要负责CAN工作模式的配置。 CAN_BTR:位时序寄存器。用来设置分频/TBs1/TBs2/Tsw等参数,设置测试模式。 CAN_(T/R)IxR:标识符寄存器。存放(待发送/接收)的报文ID、扩展ID、IDE位及RTR…

如何快速搭建实用的爬虫管理平台

目录 一、前言 二、选择合适的爬虫框架 三、搭建数据库 步骤1 步骤2 步骤3 四、搭建Web服务器 步骤1 步骤2 步骤3 步骤4 五、管理爬虫 六、总结 一、前言 爬虫是互联网数据采集的关键工具,但是随着数据量的增加和需求的多样化,手动运行和管…

SIFT图像特征表述

SIFT(尺度不变特征变换)是一种用于图像处理和计算机视觉领域的特征提取算法。其目的是检测和描述图像中的局部特征。SIFT特征对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也具有一定的稳健性。下面是SIFT特征提取的基本…