小谈设计模式(27)—享元模式

小谈设计模式(27)—享元模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 享元模式
    • 模式结构分析
      • 享元工厂(FlyweightFactory)
      • 享元接口(Flyweight)
      • 具体享元(ConcreteFlyweight)
      • 非共享具体享元(UnsharedConcreteFlyweight)
      • 客户端(Client)
    • 工作原理
      • 1
      • 2
      • 3
    • 适用场景
      • 1
      • 2
      • 3
    • 优缺点分析
      • 优点
        • 减少内存使用
        • 提高性能
        • 简化对象结构
      • 缺点:
        • 对象共享可能导致线程安全问题
        • 需要额外的管理机制
    • Java程序示例
      • 程序分析

专栏介绍

专栏地址

http://t.csdnimg.cn/VpriY

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。在享元模式中,共享的对象被称为享元(Flyweight),而非共享的对象被称为外部状态(Extrinsic State)。
在这里插入图片描述

模式结构分析

享元工厂(FlyweightFactory)

负责创建和管理享元对象。它维护一个享元池(Flyweight Pool),用于存储已经创建的享元对象。

享元接口(Flyweight)

声明共享对象的方法,可以接收外部状态作为参数。

具体享元(ConcreteFlyweight)

实现享元接口,实现共享对象的方法。具体享元对象可以被共享和重用。

非共享具体享元(UnsharedConcreteFlyweight)

不可共享的具体享元对象,通常不会被其他对象使用。

客户端(Client)

使用享元模式的对象。它通过享元工厂获取享元对象,并将外部状态传递给享元对象。
在这里插入图片描述

工作原理

1

在客户端需要使用享元对象时,首先通过享元工厂获取对象。如果对象已经存在于享元池中,则直接返回该对象;否则,创建一个新的享元对象并加入到享元池中。

2

客户端将外部状态作为参数传递给享元对象,享元对象根据外部状态进行处理,完成相应的操作。

3

客户端可以同时使用多个享元对象,每个对象都可以接收不同的外部状态。

适用场景

1

系统中存在大量相似对象,且这些对象可以共享部分内部状态。

2

对象的创建和销毁频繁,且创建和销毁对象的代价较大。

3

对象的内部状态可以被外部状态替代,且外部状态可以在对象被创建之后进行修改。
在这里插入图片描述

优缺点分析

优点

减少内存使用

通过共享对象,减少系统中的对象数量,从而减少内存的使用。

提高性能

通过共享对象,减少对象的创建和销毁次数,提高系统的性能。

简化对象结构

将对象的内部状态和外部状态分离,简化对象的结构。

缺点:

对象共享可能导致线程安全问题

如果多个线程同时访问共享对象,并修改其外部状态,可能会导致线程安全问题。

需要额外的管理机制

为了确保对象的共享和重用,需要额外的管理机制来维护享元池,增加了系统的复杂性。
在这里插入图片描述

Java程序示例

// 享元接口
public interface Flyweight {void operation(String externalState);
}// 具体享元
public class ConcreteFlyweight implements Flyweight {private String internalState;public ConcreteFlyweight(String internalState) {this.internalState = internalState;}@Overridepublic void operation(String externalState) {System.out.println("Internal state: " + internalState);System.out.println("External state: " + externalState);}
}// 享元工厂
public class FlyweightFactory {private Map<String, Flyweight> flyweights = new HashMap<>();public Flyweight getFlyweight(String key) {if (flyweights.containsKey(key)) {return flyweights.get(key);} else {Flyweight flyweight = new ConcreteFlyweight(key);flyweights.put(key, flyweight);return flyweight;}}
}// 客户端
public class Client {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();Flyweight flyweight1 = factory.getFlyweight("key1");flyweight1.operation("state1");Flyweight flyweight2 = factory.getFlyweight("key2");flyweight2.operation("state2");Flyweight flyweight3 = factory.getFlyweight("key1");flyweight3.operation("state3");}
}

程序分析

在上述示例中,享元模式通过共享具有相同内部状态的对象来减少内存使用。FlyweightFactory负责创建和管理享元对象,ConcreteFlyweight实现了享元接口,并可以被共享和重用。客户端通过享元工厂获取享元对象,并将外部状态作为参数传递给享元对象。

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

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

相关文章

竞赛选题 深度学习LSTM新冠数据预测

文章目录 0 前言1 课题简介2 预测算法2.1 Logistic回归模型2.2 基于动力学SEIR模型改进的SEITR模型2.3 LSTM神经网络模型 3 预测效果3.1 Logistic回归模型3.2 SEITR模型3.3 LSTM神经网络模型 4 结论5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 …

使用 GitHub Action 自动更新 Sealos 集群的应用镜像

在 IT 领域&#xff0c;自动化无疑已成为提高工作效率和减少人为错误的关键。Sealos 作为一个强大的云操作系统&#xff0c;已经为许多企业和开发者提供了稳定可靠的服务。与此同时&#xff0c;随着技术不断发展&#xff0c;集成更多的功能和服务变得尤为重要。考虑到这一点&am…

BAT023:将当前目录同名文件(不包括扩展名)整理到以其命名的文件夹内

引言&#xff1a;编写批处理程序&#xff0c;实现将当前目录同名文件&#xff08;不包括扩展名&#xff09;整理到以其命名的文件夹内。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.…

机器人命令表设计

演算命令 CLEAR 将数据 1 上被指定的编号以后的变数的内容&#xff0c;以及数据 2 上仅被指定的个数都清除至 0。 INC 在被指定的变数内容上加上 1。 DEC 在被指定的变数内容上减掉 1。 SET 在数据 1 上设定数据 2。 ADD 将数据 1 和数据 2 相加&#xff0c;得出的结果保存在数…

IDEA—java: 常量字符串过长问题解决

问题描述&#xff1a; Error: java: 常量字符串过长 问题分析&#xff1a; 字符串长度过长&#xff0c;导致 idea 默认使用的 javac 编译器编译不了。 解决办法&#xff1a; Javac 编译器改为 Eclipse 编译器。 File -> Settings -> Build,Execution,Deployment -&…

buuctf week2-web-Upload again!

尝试传修改后缀的普通一句话木马&#xff0c;被检测 尝试传配置文件 .htaccess 和 .user.ini 两个都传成功了 接下来继续传入经过修改的木马 GIF89a <script language"php"> eval($_POST[cmd]); </script> 没有被检测&#xff0c;成功绕过 直接上蚁剑…

免费chatGPT工具

发现很多人还是找不到好用的chatGPT工具&#xff0c;这里分享一个邮箱注册即可免费试用。 PromptsZone - 一体化人工智能平台使用 PromptsZone 与 ChatGPT、Claude、AI21 Labs、Google Bard 聊天&#xff0c;并使用 DALL-E、Stable Diffusion 和 Google Imagegen 创建图像&…

【环境】Ubuntu20.04 安装 Anaconda 顺顺利利

ubuntu里面安装的Anaconda也是顺顺利利 别忘了source source一下 参考链接 中间遇到了一个问题&#xff0c;用下面的链接轻松解决了 关于修改anaconda安装路径的问题

商贸进销存软件怎么选?

本文将为大家讲解&#xff1a;1、商贸企业进销存流程上的难点&#xff1b;2、商贸企业如何选择进销存系统&#xff1f; 在当今快速发展的商业环境中&#xff0c;有效的进销存&#xff08;Inventory Management&#xff09;管理是商贸企业成功的关键因素之一。然而&#xff0c;…

FPGA coaxpress 2.0 ip

CoaXPress是一种高速串行接口技术&#xff0c;可以实现高带宽、长距离传输和多通道传输。CoaXPress图像采集卡通常具有多个CoaXPress接口&#xff0c;可以同时连接多个相机&#xff0c;实现多通道的图像采集。它们通常具有高速数据传输能力&#xff0c;可以实时采集和传输高分辨…

什么是API网关?——驱动数字化转型的“隐形冠军”

什么是API网关 API网关&#xff08;API Gateway&#xff09;是一个服务器&#xff0c;位于应用程序和后端服务之间&#xff0c;提供了一种集中式的方式来管理API的访问。它是系统的入口点&#xff0c;负责接收并处理来自客户端的请求&#xff0c;然后将请求路由到相应的后端服…

【LeetCode高频SQL50题-基础版】打卡第7天:第36~40题

文章目录 【LeetCode高频SQL50题-基础版】打卡第7天&#xff1a;第36~40题⛅前言按分类统计薪水&#x1f512;题目&#x1f511;题解 上级经理已离职的公司员工&#x1f512;题目&#x1f511;题解 换座位&#x1f512;题目&#x1f511;题解 电影评分&#x1f512;题目&#x…

【Page-level Heap Fengshui -- Cross-Cache Overflow】corCTF2022-cache-of-castaways

前言 什么叫 Cross Cache 呢&#xff1f;其实就是字面意思&#xff0c;我们知道内核中的大部分结构体都有自己的专属 slab 内存池。那现在我们可以想象一下这个场景&#xff0c;我们拥有一个特定 kmem-cache 的溢出漏洞&#xff0c;那么我们该如何利用呢&#xff1f; 程序分析…

uni-app开发微信小程序的报错[渲染层错误]排查及解决

一、报错信息 [渲染层错误] Framework nner error (expect FLOW INITIALCREATION end but get FLOW CREATE-NODE) 二、原因分析及解决方案 第一种 原因&#xff1a;基础库版本的原因导致的。 解决&#xff1a; 1.修改调试基础库版本 2.详情—>本地设置—>调试基础库…

volatile为什么无法保证原子性

假设定义 volatile int i 0; 现在2个线程同时 i&#xff0c;为什么数据还可能会出错&#xff1f;一起来看下图&#xff0c;虽然volatile的机制是&#xff1a;如果volatile修饰的变量有修改&#xff0c;那么会将变更内容写回主内存&#xff0c;同时让其他线程工作内存的该变量缓…

Leetcode226.翻转二叉树

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Leetcode &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…

react antd table表格点击一行选中数据的方法

一、前言 antd的table&#xff0c;默认是点击左边的单选/复选按钮&#xff0c;才能选中一行数据&#xff1b; 现在想实现点击右边的部分&#xff0c;也可以触发操作选中这行数据。 可以使用onRow实现&#xff0c;样例如下。 二、代码 1.表格样式部分 //表格table样式部分{…

【基础篇】四、本地部署Flink

文章目录 1、本地独立部署会话模式的Flink2、本地独立部署会话模式的Flink集群3、向Flink集群提交作业4、Standalone方式部署单作业模式5、Standalone方式部署应用模式的Flink Flink的常见三种部署方式&#xff1a; 独立部署&#xff08;Standalone部署&#xff09;基于K8S部署…

深入解析Spring Cloud Gateway的GlobalFilter

文章目录 摘要引言GlobalFilter的作用使用GlobalFilter默认的GlobalFilter自定义GlobalFilter 示例代码配置GlobalFilter配置文件方式代码方式 高级用法&#xff1a;重写GlobalFilter思路代码实现 结论参考文献 摘要 本文将详细介绍Spring Cloud Gateway中的GlobalFilter&…

Jwt的基础入门,详细讲解

目录 一.Jwt的简介 1.1 Jwt是什么 1.2 组成部分&#xff1a; 1.3 使用JWT的步骤如下&#xff1a; 1.4 JWT的使用有以下优势&#xff1a; 1.5 JWT也有一些潜在的劣势&#xff1a; 二.Jwt的工具类 Jwt测试类&#xff1a; 三.案例----Jwt集成进spa项目 一.Jwt的简介 1.1…