设计模式——享元模式(Flyweight)

享元模式(Flyweight Pattern)是一种软件设计模式,它运用共享技术来有效地支持大量细粒度对象的复用。以下是关于享元模式的详细解释:

定义

享元模式使用共享物件,以尽可能减少内存使用量以及分享信息给尽可能多的相似物件。它特别适合用于那些因重复而导致使用大量内存的对象。通常,对象中的部分状态是可以共享的。

结构

享元模式包含以下几个主要角色:

  1. 抽象享元(Flyweight):定义了一个接口,用于描述享元对象的方法。这些方法可能包括接受并操作内蕴状态和外蕴状态。
  2. 具体享元(ConcreteFlyweight):实现了抽象享元接口,并为内蕴状态(不随环境改变而改变的状态)提供存储空间。如果有外蕴状态(随环境改变而改变的状态),则由客户端负责保存。
  3. 享元工厂(FlyweightFactory):负责创建和管理享元对象。它确保合理地共享享元,并在需要时创建新的享元。
  4. 客户端(Client):维护一个对所有享元对象的引用,存储对应的外蕴状态,并在需要时与享元对象交互。

特点

  1. 减少对象创建:通过共享已经存在的对象,享元模式可以大幅度减少需要创建的对象数量。
  2. 降低系统内存:由于减少了对象的创建,享元模式可以有效地降低系统的内存消耗。
  3. 提高系统资源利用率:通过共享和复用对象,享元模式可以提高系统资源的利用率。

使用场景

享元模式适用于以下场景:

  1. 大量共享对象的场景:如数据库连接池、线程池等,这些对象可以通过享元模式来实现共享,减少对象的创建和销毁,提高系统的性能和可扩展性。
  2. 大数据量的场景:如图像处理中的像素点、文本处理中的单词等,这些对象可以通过享元模式来共享,减少对象的创建和内存消耗。
  3. 高并发的场景:如电商网站的购物车、在线游戏的排行榜等,这些对象可以通过享元模式来共享,减少对象的创建和销毁,提高系统的并发处理能力和响应速度。
  4. 分布式系统中的对象共享:如分布式缓存系统、分布式锁等,这些对象需要在不同的节点之间共享,享元模式可以有效地支持这种共享。

示例

当然,下面是一个简单的享元模式的Java代码示例。在这个例子中,我们将创建一个Flyweight接口,一个具体的Flyweight实现类(例如ConcreteFlyweight),一个FlyweightFactory用于创建和存储Flyweight对象,以及一个Client类来展示如何使用这些对象。

// Flyweight 接口
public interface Flyweight {void operation(UnsharedConcreteFlyweight state);
}// UnsharedConcreteFlyweight 类,包含外蕴状态
public class UnsharedConcreteFlyweight {// 外蕴状态数据private String extrinsicState;public UnsharedConcreteFlyweight(String extrinsicState) {this.extrinsicState = extrinsicState;}// 获取外蕴状态public String getExtrinsicState() {return extrinsicState;}
}// ConcreteFlyweight 类,实现Flyweight接口,包含内蕴状态
public class ConcreteFlyweight implements Flyweight {// 内蕴状态数据private String intrinsicState;public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}// 展示内蕴状态和外蕴状态的操作@Overridepublic void operation(UnsharedConcreteFlyweight state) {System.out.println("Intrinsic State: " + intrinsicState);System.out.println("Extrinsic State: " + state.getExtrinsicState());}
}// FlyweightFactory 类,用于存储和创建Flyweight对象
public class FlyweightFactory {// 享元对象的存储private static Map<String, Flyweight> flyweights = new HashMap<>();// 获取Flyweight对象public static Flyweight getFlyweight(String key) {Flyweight flyweight = flyweights.get(key);if (flyweight == null) {flyweight = new ConcreteFlyweight(key);flyweights.put(key, flyweight);}return flyweight;}
}// Client 类,客户端代码
public class Client {public static void main(String[] args) {// 外蕴状态UnsharedConcreteFlyweight extrinsicStateA = new UnsharedConcreteFlyweight("Extrinsic A");UnsharedConcreteFlyweight extrinsicStateB = new UnsharedConcreteFlyweight("Extrinsic B");// 获取享元对象Flyweight flyweightA = FlyweightFactory.getFlyweight("Intrinsic A");Flyweight flyweightB = FlyweightFactory.getFlyweight("Intrinsic B");// 展示操作flyweightA.operation(extrinsicStateA);flyweightB.operation(extrinsicStateB);// 再次使用相同的内蕴状态Flyweight flyweightA_again = FlyweightFactory.getFlyweight("Intrinsic A");// 注意这里flyweightA_again和flyweightA是同一个对象System.out.println("flyweightA == flyweightA_again: " + (flyweightA == flyweightA_again));}
}

在这个例子中,Flyweight接口定义了一个操作,该操作需要一个UnsharedConcreteFlyweight对象作为参数(这代表了外蕴状态)。ConcreteFlyweight类实现了Flyweight接口,并存储了内蕴状态。FlyweightFactory类负责创建和存储Flyweight对象,它使用了一个Map来存储已经创建的享元对象。在Client类中,我们展示了如何使用FlyweightFactory来获取享元对象,并调用其操作。注意,当使用相同的内蕴状态再次请求享元对象时,FlyweightFactory将返回已经存在的对象。

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

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

相关文章

17 空闲空间管理

目录 假设 底层机制 分割与合并 追踪已分配空间的大小 嵌入空闲列表 让堆增长 基本策略 最优匹配 首次匹配 下次匹配 其他方式 分离空闲列表 伙伴系统 小结 分页是将内存成大小相等的内存块&#xff0c;这样的机制下面&#xff0c;很容易去管理这些内存&#xff0c…

巩固学习2

如何寻找bug class Distance:def __init__(self,ntxt):self.x1eval(ntxt[0])self.x2eval(ntxt[1])self.y1eval(ntxt[2])self.y2eval(ntxt[3])print(self.y2,self.y1)def getdistance(self):distancepow(pow(self.x2-self.x1, 2) pow(self.y2-self.y1, 2),0.5)return distance…

Word表格标题间距大修改环绕为无仍无法解决

1.选中表格&#xff0c;右键选择【表格属性】 2.选择【环绕】&#xff0c;此时【定位】可以被启用&#xff08;如下&#xff09;&#xff0c;点击进入窗口 3.修改参数和下面一模一样 注意&#xff1a;【垂直】那里的修改方式是先选段落&#xff0c;后在位置输入0

C语言中栈数据结构的基本实现

概述 栈的特点 使用只能在一端进行插入和删除操作的特殊线性表。 按照后进先出的原则存储数据&#xff1a; 先进入的数据被压入栈底&#xff0c;最后的数据在栈顶需要读取数据的时候&#xff0c;从栈顶开始读取数据 基本实现 栈的创建和初始化 stack.h #ifndef C01_HEL…

python:鸭子类型使用场景

python&#xff1a;鸭子类型使用场景 1 前言 “一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子&#xff0c;那么这只鸟可以被称为鸭子。“----鸭子模型 鸭子模型是Python中的一种编程哲学&#xff0c;也被称为“鸭子类型”。它来源于一句话&#xff1a;“如果它走起路…

qt 5.15.x 安装android过程记录

1.经过好几天的qt for android 安装&#xff0c;发现存在很多坑 参考其他文章可以编译出APK文件。但是我发现(我的机器上)无法调试apk程序&#xff0c;不能调试那怎么行呢&#xff0c;看了很多文章都是运行出结果了就结束了。没有展示怎么调试程序。 很多文章都是建议安装JDK8…

CTF数据安全大赛crypto题目解题过程

CTF-Crypto加密题目内容 下面是一个Base64加密的密文 bXNobnszODdoajM3MzM1NzExMzQxMmo4MGg0bDVoMDYzNDQzNH0原文链接&#xff1a; 数据安全大赛CTF-Crypto题目 - 红客网-网络安全与渗透技术 我们用Python写一个解密脚本&#xff1a; import base64 import time #base64加密…

韩顺平0基础学Java——第7天

p110-p154 控制结构&#xff08;第四章&#xff09; 多分支 if-elseif-else import java.util.Scanner; public class day7{public static void main(String[] args) {Scanner myscanner new Scanner(System.in);System.out.println("input your score?");int s…

什么是Jetpack

Jetpack Jetpack 是一套组件库、工具&#xff0c;可帮助开发人员遵循最佳做法&#xff0c;减少样板代码并编写可在 Android 版本和设备上一致工作的代码&#xff0c;以便开发人员可以专注于他们关心的代码 组成 主要包含四部分&#xff1a;架构&#xff08;Architecture&…

Linux:进程通信(三)信号的捕捉

目录 一、信号捕捉函数 1、signal函数 2、sigaction函数 二、用户态与内核态 1、用户态 2、内核态 用户态与内核态转换 三、volatile关键字 四、SIGCHLD信号 一、信号捕捉函数 1、signal函数 signal函数是C语言标准库中的一个函数&#xff0c;用于处理Unix/Linux系…

Ps 滤镜:其它

Ps菜单&#xff1a;滤镜/其它 Filter/others “其它”子菜单中的滤镜允许创建自己的滤镜、使用滤镜修改蒙版、在图像中使选区发生位移和快速调整颜色。 HSB/HSL HSB/HSL 主要用于实现 RGB、HSB 及 HSL 三种模型的相互转换。 比如&#xff0c;当执行本滤镜从 RGB 转换为 HSB 之后…

国内不同领域对应的AI简谈

AI的普及极大方便了我们的学习和生活&#xff0c;当然&#xff0c;我们很多时候仍找不到适合自己需求的AI工具&#xff0c;那我们便盘点一下国内直接访问的各个领域的AI工具&#xff1a; AI写作辅助 秘塔写作猫说明&#xff1a;秘塔写作猫是一款AI写作工具&#xff0c…

YOLOv8网络结构介绍

将按照YOLOv8目标检测任务、实例分割任务、关键点检测任务以及旋转目标检测任务的顺序来介绍&#xff0c;主要内容也是在目标检测任务中介绍&#xff0c;其他任务也只是Head层不相同。 1.YOLOv8_det网络结构 首先&#xff0c;YOLOv8网络分成了三部分&#xff0c;分别是主干网络…

接口信息解析

在进行浏览器网站的接口测试时&#xff0c;需要解析以下关键信息以确保接口的正确性和性能&#xff1a; 1. 接口地址&#xff08;URL&#xff09;&#xff1a; 接口的地址是测试的基础&#xff0c;包括接口的协议&#xff08;如 HTTP 或 HTTPS&#xff09;、主机名、端口&…

leetcode 2105. 给植物浇水 II

2105. 给植物浇水 II 题目描述 Alice 和 Bob 打算给花园里的 n 株植物浇水。植物排成一行&#xff0c;从左到右进行标记&#xff0c;编号从 0 到 n - 1 。每一株植物都需要浇特定量的水。Alice 和 Bob 每人有一个水罐&#xff0c;最初是满的。他们按照以下描述的方式完成浇水…

自动控制原理学习--平衡小车的控制算法(三)

上一节PID的simulin仿真&#xff0c;这一节用LQR 一、模型 二、LQR LQR属于现代控制理论的一个很重要的点&#xff0c;这里推荐B站的【Advanced控制理论】课程&#xff08;up主DR_CAN&#xff09;&#xff0c;讲得很好&#xff0c;这里引用了他视频里讲LQR的ppt。 LQR属于lo…

(三)小程序样式和组件

视频链接&#xff1a;尚硅谷2024最新版微信小程序 文章目录 小程序的样式和组件介绍样式-尺寸单位 rpx样式-全局样式和局部样式组件-组件案例演示组件案例-轮播图区域绘制组件案例-轮播图图片添加组件案例-绘制公司信息区域组件案例-商品导航区域组件案例-跳转到商品列表组件案…

python爬取sci论文等一系列网站---通用教程超详细教程

环境准备 确保安装了Python以及requests和BeautifulSoup库。 pip install requests beautifulsoup4确定爬取目标 选择一个含有SCI论文的网站&#xff0c;了解该网站的内容布局和数据结构。 &#xff08;1&#xff09;在浏览器中访问目标网站&#xff0c;右键点击页面并选择…

案例研究|硬之城借助DataEase以数据驱动供应链精细化管理

深圳硬之城信息技术有限公司&#xff08;以下简称为“硬之城”&#xff09;成立于2015年&#xff0c;专注电子元件供应链领域&#xff0c;定位于电子产业供应链与智造平台。硬之城通过名为“Allchips”的集成式服务平台&#xff0c;为客户提供一站式的电子元件采购和供应链管理…

VTK 建模方法:建模基础

VTK 建模方法&#xff1a;建模基础 VTK 建模方法&#xff1a;建模基础VTK 中模型的表达实例1&#xff1a;自定义 vtkPolyData实例2&#xff1a;vtkTubeFilter实例3&#xff1a;vtkImplicitModeller实例4&#xff1a;vtkRegularPolygonSource实例5&#xff1a;vtkWarpTo VTK 建模…