设计模式:生活中的享元模式

享元模式的概念可以用日常生活中的图书馆来类比。想象一下,图书馆中的书籍就像是需要大量重复使用的对象。

图书馆中的书籍:享元对象

在图书馆中,每本书都有一个或多个副本。如果每个想要阅读特定书籍的读者都去购买一个新副本,那将是非常昂贵且不必要的。图书馆通过让读者共享这些书籍来解决这个问题。在这里,每本书就像是一个享元对象,它们被存储起来,多个读者可以借阅同一本书。

书籍的内容:内部状态

书籍的内容是不变的,无论谁借阅这本书,书中的文字和信息都是相同的。这就类似于享元对象的内部状态,它是共享的且不会改变。

读者阅读书籍的环境:外部状态

当读者借阅书籍时,他们可能在不同的环境下阅读,比如在家中、在公园、在咖啡店等。每个读者阅读的时间、地点和方式都可能不同,这就类似于享元对象的外部状态,它因使用的上下文而异,不是共享的。

图书馆的书架:享元工厂

图书馆的书架可以看作是享元工厂,它管理着所有的书籍(享元对象)。当读者需要借阅一本书时,他们会去书架上找到这本书并借阅。如果书籍已经被借出,他们可能需要等待或借阅另一本书。图书馆确保每本书都有其特定的位置,便于读者找到和归还。

类比总结

通过这个图书馆的例子,我们可以看到享元模式是如何工作的:

  • 共享:图书馆中的书籍被不同的读者共享,就像享元模式中的共享对象一样。
  • 内部状态:书籍的内容是不变的,相当于享元对象的内部状态。
  • 外部状态:读者阅读书籍的具体环境(时间、地点等)是变化的,相当于享元对象的外部状态。
  • 管理:图书馆管理书籍的存储和借阅,就像享元工厂管理享元对象的创建和复用。

这个类比有助于我们理解享元模式的核心思想:通过共享和管理内部状态不变的对象,来有效地节约资源和提高效率。在软件设计中,这意味着通过共享相似对象来减少内存占用,同时处理外部状态来满足不同的使用场景。

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

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

相关文章

深入浅出 -- 系统架构之单体到分布式架构的演变

一、传统模式的技术改革 在很多年以前,其实没有严格意义上的前后端工程师之分,每个后端就是前端,同理,前端也可以是后端,即Ajax、jQuery技术未盛行前的年代。 起初,大部分前端界面很简单,显示的…

AcWing1402.星空之夜

【题目链接】1402. 星空之夜 - AcWing题库 夜空深处,闪亮的星星以星群的形式出现在人们眼中,形态万千。 一个星群是指一组非空的在水平,垂直或对角线方向相邻的星星的集合。 一个星群不能是一个更大星群的一部分。 星群可能是相似的。 如…

上传下载图片的

上传图片 1.上传图片的方法一般是用Upload组件直接上传File的信息 2.通过FormData对象上传 FormData对象是一个JavaScript对象,可以用来存储表单数据 headers:{“Content-type”:“multipart/form-data”} 3.通过Form表单上传 在HTML中创建一个表单&#xff0c…

【蓝桥杯】GCD与LCM

一.概述 最大公约数(GCD)和最小公倍数(Least Common Multiple,LCM) 在C中,可以使用 std::__gcd(a, b)来计算最大公约数 1.欧几里德算法/辗转相除法 int gcd(int a,int b){return b?gcd(b, a%b):a; } 2…

Tensorboard以及Transforms初步学习

一.前情提要 1.本文是代码结合知识点,注释即为知识点 2.主要详细讲解Tensorboard以及Transforms代码以及基础知识 3.若想深入学习,建议阅读 P3. Python学习中的两大法宝函数(当然也可以用在PyTorch)_哔哩哔哩_bilibili 二.简述…

抖音运营技巧

1、视频时长 抖音的作品是否能够继续被推荐,取决于综合数据,包括完播率、点赞率、评论率、转发率和收藏率等。其中,完播率是最容易控制的因素。对于新号来说,在没有粉丝的初期,发布过长的视频可能会导致无人观看。因此…

金田金业带你一文了解现货黄金开户注意事项

现货黄金作为一种受欢迎的投资品种,吸引了越来越多的投资者。然而,在进行现货黄金开户时,有一些重要的注意事项需要牢记。本文将为您详细介绍现货黄金开户的九大关键要点,确保您能够在投资过程中做出明智的决策。 第一&#xff0c…

汇编——SSE对齐

SIMD是(Single Instrument Multi Data),MMX实现了SIMD;SSE是(Streaming SIMD Extension),它取代了MMX;后来AVX(Advanced Vector Extension,高级向量扩展)对SSE进行了扩展…

Java- maven下载jar包,提示找不到,Could not find artifact

1、执行下面命令行 mvn install:install-file -Dfile/home/quangang/桌面/isv-sdk-2.0.jar -DgroupIdcom.jd -DartifactIdisv-sdk -Dversion2.0 -Dpackangjar 2、然后这里要加上jar包

C语言:strlen和sizeof的适用场景

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️感谢大家点赞👍&…

macOS上QT打开麦克风和摄像头的权限问题

同样的代码在Windows上可以轻松操作麦克风和摄像头,特别是用QT这种跨平台的框架。但是对macOS这种权限要求完善的系统还需要进行一些配置,那就是增加Info.plist属性配置文件。如果是之前的早期5.x版本的QTCreator因为使用的是qmake构建系统,估…

No dashboards are active for the current data set.

再次记录一下这个离谱的问题 之前出现这个问题是因为目录没写对 今天遇到这个问题的原因是目录是对的,跟目录是否带有中文也没关系 是writer写入的时候写的是空的,离谱的是写入是空的情况下也会生成events日志文件,看起来好像成功写入了一样&…

Spring源码解析上

spring源码解析 整体架构 defaultListableBeanFactory xmlBeanDefinitionReader 创建XmlBeanFactory 对资源文件进行加载–Resource 利用LoadBeandefinitions(resource)方法加载配置中的bean loadBeandefinitions加载步骤 doLoadBeanDefinition xml配置模式 validationMode 获…

2024-04-05 问AI: 介绍一下深度学习中的Leaky ReLU函数

文心一言 Leaky ReLU(Leaky Rectified Linear Unit)函数是深度学习领域中的一种激活函数,主要用于解决ReLU(Rectified Linear Unit)函数在负值区域为零的问题。ReLU函数在输入为正时保持原样,而在输入为负…

nodejs实现TCP端口转发并截包的小工具

近期我正致力于开发一个基于 Go-CQHTTP 的 QQ 机器人应用程序项目,该项目现已成功实现了 Go-CQHTTP 的容器化部署,利用 Docker 技术确保其运行环境的一致性与便捷性。随着项目推进,接下来的工作重心转向部署配套的签名服务器(qsig…

软考111-上午题-【计算机网络】-URL和DNS

一、URL解析 org:各类组织结构(非盈利团队) 1-1、顶级域 顶级域名是域名的最后一个部分,即是域名最后一点之后的字母,例如:www.baidu.com这个域名中,顶级域是.com(或.COM&#xff…

WPF中TextWrapping

在 WPF(Windows Presentation Foundation)中,TextWrapping 是一个与文本布局相关的属性,用于控制文本在遇到容器边界时是否自动换行。这个属性常用于文本展示控件,如 TextBlock、TextBox、Label 等,以确保文…

数据结构系列-队列的结构和队列的实现

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 队列 队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除删除数据操作的特殊线性表,队列具有先进先出FIFO,…

全面解析找不到msvcr110.dll,无法继续执行代码的解决方法

MSVCR110.dll的丢失可能导致某些应用程序无法启动。当用户试图打开依赖于该特定版本DLL文件的软件时,可能会遭遇“找不到指定模块”的错误提示,使得程序启动进程戛然而止。这种突如其来的故障不仅打断了用户的正常工作流程,也可能导致重要数据…