金三银四面试题(二十四):享元模式知多少?

什么是享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,从而提高性能。它主要用于处理大量细粒度对象的情况,通过将这些对象的可共享部分(内部状态)集中起来存储,以便多个对象可以共享这些部分,从而节省内存。

享元模式的特点

  1. 共享内部状态:享元模式中的对象将内部状态分为共享的和非共享的。共享的内部状态是可以在多个对象之间共享的,例如颜色、形状等,这些状态通常存储在享元工厂中,并由多个享元对象共享。

  2. 外部状态:非共享的状态称为外部状态,它通常是每个对象的独特状态,在使用享元对象时由客户端提供。

  3. 享元工厂:享元模式通常通过一个享元工厂来创建和管理享元对象。工厂会检查对象是否已经存在,如果已经存在,就返回现有对象;如果不存在,则创建一个新对象。

  4. 对象池:享元工厂通常使用一个对象池来存储共享的对象,以便复用这些对象。

应用场景

  • 当应用程序需要处理大量细粒度对象时。
  • 对象的大量创建会导致内存消耗过多。
  • 对象的可共享状态可以提取出来,并在多个对象之间共享。
  • 外部状态可以从对象中移出,并传递给享元对象的客户端。

优点

  • 节省内存:通过共享对象,减少了对象的数量,从而节省了内存。
  • 提高性能:由于对象的复用,减少了对象的创建和销毁,提高了性能。

缺点

  • 需要仔细分析哪些状态可以共享,否则可能导致代码复杂。
  • 如果外部状态处理不当,可能会导致线程安全问题。

举个例子

import java.util.HashMap;
import java.util.Map;// 享元接口
interface Flyweight {void operation(String externalState);
}// 具体享元类
class ConcreteFlyweight implements Flyweight {private final String intrinsicState;public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}@Overridepublic void operation(String externalState) {System.out.println("Intrinsic state: " + intrinsicState + ", External state: " + externalState);}
}// 享元工厂
class FlyweightFactory {private final Map<String, Flyweight> flyweights = new HashMap<>();public Flyweight getFlyweight(String key) {Flyweight flyweight = flyweights.get(key);if (flyweight == null) {flyweight = new ConcreteFlyweight(key);flyweights.put(key, flyweight);}return flyweight;}public int getFlyweightCount() {return flyweights.size();}
}// 客户端代码
public class FlyweightPatternDemo {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();// 获取享元对象并执行操作Flyweight flyweight1 = factory.getFlyweight("State1");flyweight1.operation("External1");Flyweight flyweight2 = factory.getFlyweight("State1");flyweight2.operation("External2");Flyweight flyweight3 = factory.getFlyweight("State2");flyweight3.operation("External1");// 显示享元对象的数量System.out.println("Number of flyweight objects: " + factory.getFlyweightCount());}
}

在这个示例中,FlyweightFactory 是享元工厂,它通过键(状态)来管理享元对象。当客户端请求一个享元对象时,工厂会返回现有对象或创建一个新对象。ConcreteFlyweight 是具体享元类,它有一个内在状态,可以在多个对象之间共享。

思考

享元模式和单例模式是如此相像,那么区别是什么?

往期推荐

金三银四面试题(二十一):代理模式知多少?2024-04-16
金三银四面试题(二十):单例模式知多少?2024-04-15
金三银四面试题(十九):MySQL中的锁2024-04-09
MySQL基础练习题:习题7-112024-04-09
金三银四面试题(十八):MySQL索引2024-04-08
MySQL基础练习题:习题4562024-04-08
金三银四面试题(十七):MySQL面试都问什么(2)2024-04-07
MySQL基础练习题:习题2-32024-04-07
MySQL基础练习题:创建数据库2024-04-07
金三银四面试题(十六):MySQL面试都问什么(1)2024-04-07

在这里插入图片描述

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

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

相关文章

毫米波雷达原理(含代码)(含ARS548 4D毫米波雷达数据demo和可视化视频)

毫米波雷达原理 1. 传统毫米波雷达1.1 雷达工作原理1.2 单目标距离估计1.3 单目标速度估计1.4 单目标角度估计1.5 多目标距离估计1.6 多目标速度估计1.7多目标角度估计1.7 总结 3. FMCW雷达数据处理算法4. 毫米波雷达的目标解析(含python代码)5. ARS548 4D毫米波雷达数据demo(含…

MYSQL从入门到精通(二)

1、MYSQL高级概述 【1】架构概述 【2】索引优化 【3】查询截取 【4】mysql锁机制 【5】主从复制 2、MYSQL概述 【1】mysql内核 【2】sql优化工程师 【3】mysql服务器的优化 【4】各种参数常量设定 【5】查询语句优化 【6】主从复制 【7】软硬件升级 【8】容灾百分 【9】sql编…

Flutter笔记:Widgets Easier组件库(1)使用各式边框

Flutter笔记 Widgets Easier组件库&#xff08;1&#xff09;&#xff1a;使用边框 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress o…

Leetcode—377. 组合总和 Ⅳ【中等】

2024每日刷题&#xff08;124&#xff09; Leetcode—377. 组合总和 Ⅳ 算法思想 实现代码 class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<unsigned long long>dp(target 1);dp[0] 1;for(int i 1; i < target;…

React、React Router 和 Redux 常用Hooks 总结,提升您的开发效率!

Hooks 是 React 16.8 中引入的一种新特性&#xff0c;它使得函数组件可以使用 state 和其他 React 特性&#xff0c;从而大大提高了函数组件的灵活性和功能性。下面分别总结React、React Router 、Redux中常用的Hooks。 常用Hooks速记 React Hooks useState&#xff1a;用于…

社交媒体数据恢复:WorldTalk

WorldTalk数据恢复方法 在本文中&#xff0c;我们将探讨如何恢复在WorldTalk中删除的信息。请注意&#xff0c;这些步骤并不是专门针对WorldTalk软件设计的&#xff0c;而是基于一般的手机数据恢复流程。由于WorldTalk是一款全球5亿人使用的交友APP&#xff0c;用户分别来自中…

EDA(一)Verilog

EDA&#xff08;一&#xff09;Verilog Verilog是一种用于电子系统设计自动化&#xff08;EDA&#xff09;的硬件描述语言&#xff08;HDL&#xff09;&#xff0c;主要用于设计和模拟电子系统&#xff0c;特别是在集成电路&#xff08;IC&#xff09;和印刷电路板&#xff08;…

TCP 协议

TCP协议段格式 源/目的端口号&#xff1a;表示数据是从哪个进程来&#xff0c;到哪个进程去。 序号&#xff1a;发送数据的序号。 确认序号&#xff1a;应答报文的序号&#xff0c;用来回复发送方的。 4 位首部长度&#xff1a;一个 TCP 报头&#xff0c;长度是可变的&#xff…

zotero better notes报错:Error: ReferenceError: topItem is not defined

我的自定义笔记模板名称是&#xff1a;简约风格 然后就遇到了以下报错&#xff1a; Error: ReferenceError: topItem is not defined 解决办法&#xff1a; 将模板名称前面加上[Item] 之后就可以正常导入笔记模板了~

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…

FIFO Generate IP核使用——AXI接口FIFO简介

AXI接口FIFO是从Native接口FIFO派生而来的。AXI内存映射接口提供了三种样式&#xff1a;AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的应用外&#xff0c;AXI FIFO还可以用于AXI系统总线和点对点高速应用。 AXI接口FIFO不支持Builtin FIFO和 Shift Register FIFO配置。 当…

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者&#xff0c;如图所示。这样就不存在多个提议者同时提交提案的情况&#xff0c;也就不存在提案冲突的情况了。这里补充一点:在论文中…

CVE-2022-2602:unix_gc 错误释放 io_uring 注册的文件从而导致的 file UAF

前言 复现该漏洞只是为了学习相关知识&#xff0c;在这里仅仅做简单记录下 exp&#xff0c;关于漏洞的详细内容请参考其他文章&#xff0c;最后在 v5.18.19 内核版本上复现成功&#xff0c;v6.0.2 复现失败 漏洞利用 diff --git a/include/linux/skbuff.h b/include/linux/s…

保存钉钉群直播回放下载:直播回放下载步骤详解

今天&#xff0c;我们就来拨开云雾&#xff0c;揭开保存钉钉群直播回放的神秘面纱。教会你们如何下载钉钉群直播回放 首先用到的工具我全部打包好了&#xff0c;有需要的自己下载一下 钉钉群直播回放工具下载&#xff1a;https://pan.baidu.com/s/1WVMNGoKcTwR_NDpvFP2O2A?p…

从零开始学AI绘画,万字Stable Diffusion终极教程(一)

【第1期】SD入门 2022年8月&#xff0c;一款叫Stable Diffusion的AI绘画软件开源发布&#xff0c;从此开启了AIGC在图像上的爆火发展时期 率先学会SD的人&#xff0c;已经挖掘出了越来越多AI绘画有趣的玩法 从开始的AI美女、线稿上色、真人漫改、头像壁纸 到后来的AI创意字、AI…

M2 Mac mini跑Llama3

前言 在4-19左右&#xff0c;Meta 宣布正式推出下一代开源大语言模型 Llama 3&#xff1b;共包括 80 亿和 700 亿参数两种版本&#xff0c;号称 “是 Llama 2 的重大飞跃”&#xff0c;并为这些规模的 LLM 确立了新的标准。实际上笔者早就体验过&#xff0c;只不过自己电脑没什…

在家连学校的服务器

在家连接学校的服务器。 Step1: 首先下载一个vscode的插件 Visual Studio Code - Code Editing. Redefined 我的服务区是ubuntu20.04&#xff0c;x64的&#xff0c;所以下载这个。 Step2: 下载到本地之后&#xff0c;想办法将这个文件拷贝到你的服务器上。 Step3: 解压该包…

自动化滇医通

###我已经将数据爬取出来### 现在开源集合大家的思路一起研究 &#xff08;请更换ip 以及 暂停时间 不然会提示违规操作&#xff09; 脚本读取预约信息后开始随机抢一家的&#xff0c;qiang方法里面请自行修改抓包数据参数&#xff01;&#xff01; 现在开源大家一起讨论 pyt…

3.【Orangepi Zero2】超声模块ultrasonic(HC-SR04)

超声模块ultrasonic&#xff08;HC-SR04&#xff09; HC-SR04 超声波距离传感器如何工作&#xff1f;程序实现初始化超声波启动超声波获取距离整合代码 HC-SR04 超声波距离传感器如何工作&#xff1f; 当Trig引脚设置为高电平达 10s 时&#xff0c;超声波距离传感器开始工作。…

Java进阶-Java Stream API详解与使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例&#xff0c;文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同&…