23种设计模式——享元模式(Flyweight Pattern) - 实践

news/2025/11/8 13:49:23/文章来源:https://www.cnblogs.com/gccbuaa/p/19202212

✅作者简介: Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java手艺内容。就是大家好,我
个人主页:Meteors.的博客
当前专栏:设计模式
✨特色专栏:知识分享
本文内容:23种设计模式——享元模式(Flyweight Pattern)
** ps **  :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一. 背景

二. 介绍

三. 关键角色

四. 核心思想

五. 应用场景

六. 具体案例

七. 总结


一. 背景

把已创建的元素分享出去,避免相同的元素过多。和内存的缓存类似,就是享元模式,相信很多人都会对它有点陌生。和它的命名类似,它本质上其实就在​​分布式环境、服务之间共享​。那么享元模式就是就是如果说Redis缓存在​​进程内、对象级别共享​。下面会对享元模式进行详细的介绍。


二. 介绍

享元模式(Flyweight Pattern)是23种设计模式中的一种结构型模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。

享元模式的通过共享技术来有效地支持大量细粒度对象的复用就是核心思想。它将对象的内部状态和外部状态区分开来,内部状态是对象共享的部分,外部状态是对象独立的部分。
当系统中存在大量相似或完全相同的对象,且这些对象消耗大量内存时,享元模式能够通过共享相同的部分来显著减少内存使用


三. 主要角色

Flyweight(抽象享元类):定义对象的接口,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。
ConcreteFlyweight(具体享元类):实现抽象享元角色所规定的接口。如果有内部状态,可以在类内部定义。
FlyweightFactory(享元工厂类):负责创建和管理享元角色。当客户端请求一个具体享元角色时,享元工厂角色得检查系统中是否已有一个符合要求的享元角色。如果已经有了,享元工厂角色就应当供应这个已有的享元角色;如果没有,则创建一个合适的享元角色。
Client(客户端):维护对所有享元对象的引用,而且还需要存储对应的外部状态。


四. 核心思想

享元模式的关键是区分内部状态和外部状态:
内部状态(Intrinsic State):在享元对象内部不随外界环境改变而改变的共享部分。
外部状态(Extrinsic State):随环境改变而改变的、不能够共享的状态。


五. 应用场景

通过在下面场景中,能够考虑采用享元模式:

  1. 平台中存在大量相似对象
  2. 对象创建和存储成本较高
  3. 对象可以轻松共享而不影响其外部行为
  4. 系统不依赖于这些对象的身份,这些对象是不可分辨的

具体的场景中,在下面情况下,我们可以考虑使用享元模式:

  1. 文本编辑器中的字符对象:在处理大量文本时,每个字符许可作为享元对象,字符的字体、大小等作为内部状态,字符在文档中的位置作为外部状态。
  2. 游戏开发中的粒子系统:在游戏特效中,大量的粒子可以共享纹理、模型等内部状态,而位置、速度等作为外部状态。
  3. Java中的String常量池:享元模式的应用,相同内容的字符串在内存中只保存一份。就是Java的String常量池就

六. 具体案例

形状的x/y的坐标:就是下面是一个使用享元模式实现画图的demo,内部状态就是形状的颜色,外部状态

import java.util.HashMap;
import java.util.Map;
// 抽象享元类
interface Shape {void draw(int x, int y);
}
// 具体享元类
class Circle implements Shape {// 内在状态 - 可以共享的属性private String color;public Circle(String color) {this.color = color;System.out.println("创建新的圆形: " + color);}// 外在状态 - 随环境变化,不可共享的属性,由客户端传入@Overridepublic void draw(int x, int y) {System.out.println("绘制圆形 - 颜色: " + color + ", 坐标: (" + x + "," + y + ")");}
}
// 享元工厂类
class ShapeFactory {private static final Map shapeMap = new HashMap<>();public static Shape getCircle(String color) {Shape circle = shapeMap.get(color);if (circle == null) {circle = new Circle(color);shapeMap.put(color, circle);System.out.println("创建新的圆形并放入缓存中: " + color);} else {System.out.println("复用缓存中的圆形: " + color);}return circle;}public static int getShapeCount() {return shapeMap.size();}
}
// 客户端代码
public class FlyweightPatternDemo {private static final String[] colors = {"红色", "绿色", "蓝色", "黄色", "黑色"};public static void main(String[] args) {// 创建大量圆形对象for (int i = 0; i < 20; ++i) {Circle circle = (Circle) ShapeFactory.getCircle(getRandomColor());circle.draw(getRandomX(), getRandomY());}System.out.println("总共创建的圆形对象数量: " + ShapeFactory.getShapeCount());}private static String getRandomColor() {return colors[(int) (Math.random() * colors.length)];}private static int getRandomX() {return (int) (Math.random() * 100);}private static int getRandomY() {return (int) (Math.random() * 100);}
}

七. 总结

通俗的说,享元模式通过共享技术来高效地帮助大量细粒度对象的复用,以减少内存应用和提高性能。当我们有多个相似对象,且有部分相同属性时,允许考虑运用享元模式,减少对象数量,共享相同对象以节省内存。

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

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

相关文章

将 Zabbix 的数据导入到 Grafana 中进行可视化

Grafana 是一个非常强大的数据可视化工具,而 Zabbix 是一个流行的企业级监控解决方案。将 Zabbix 的数据导入到 Grafana 中进行可视化,可以帮助你更直观地展示各种监控指标。以下是一个详细的教程,介绍如何将 Zabbi…

zabbix的详细使用教程

Zabbix 详细使用教程 Zabbix 是一个开源的企业级监控解决方案,能够监控各种网络设备、服务器、虚拟化平台、数据库等。Zabbix 通过对数据收集、报警通知和数据可视化等功能的整合,帮助管理员进行实时监控和故障排查。…

WAF 在 “纯内网环境 + 内网可上互联网” 场景中的作用分析

WAF 在 “纯内网环境 + 内网可上互联网” 场景中的作用分析 结合 “内网电脑可访问互联网” 的核心前提,以及 WAF 部署于 “服务器群与核心交换机之间” 的架构,WAF 在该场景下不仅有用,且是内网 Web 安全防护的关键…

网络工程师必备神器

开头 作为一枚网络工程师,干着网络管理员的活,经常要抱着电脑穿梭于各个隐蔽的机柜、嘈杂的机房,去寻找迷失的交换机和路由器。电脑上也有攒着着一些神器,可以辅助我们快速的解决问题。 今天我就力推一款软件—千月…

react和vue

React 和 Vue 的详细使用教程 React 和 Vue 都是流行的前端框架,用于构建现代化的网页应用。它们各自有不同的设计哲学和实现方式,但都能帮助开发者高效构建用户界面。在这篇教程中,我将分别介绍 React 和 Vue 的基…

grafana的详细使用教程

Grafana 是一个开源的分析和监控平台,主要用于可视化不同数据源(如 Prometheus、Zabbix、InfluxDB、Elasticsearch 等)中的时间序列数据。通过 Grafana,用户可以创建实时监控面板、分析数据并进行报警通知。下面是…

十大最佳网络监控工具

有效的网络监控对于维护当今复杂 IT 环境的性能和可靠性至关重要。借助正确的工具,网络管理员可以在问题影响最终用户之前主动识别和解决问题。在这篇文章中,我们将探讨一些最佳的网络监控解决方案,包括基于云的平台…

LaTeX学习笔记:快速上手指南

LaTeX学习笔记:快速上手指南LaTeX 学习笔记:快速上手指南 众所周知,\(\LaTeX\) 语言本质上是一套封装了 \(\TeX\) 处理细节的宏,其中使用的每一个标记实际上都是一个宏。下面,让我们先来简单了解一下 \(\LaTeX\) …

koupleless demo依赖问题

最进入职了一家新公司,使用的是koupleless架构,让我本地运行下koupleless的demo,开发文档可以查看官网[https://koupleless.io/docs/quick-start/module_dev/](Koupleless 快速开始) 也可以直接从github上下载sampl…

有一种考前背书的美(省选 2026 Edition)

考前复习资料(省选 2025 Edition) 有一些太熟悉的例如线段树、树状数组、FWT 感觉就不写了。注意,要看的是不熟悉的! 目录考前复习资料(省选 2025 Edition)经典永流传Linux 相关虚拟机配置.gdbinit.vimrc.bashrc…

【C语言】杨辉三角:数学之美与编程建立的完美结合

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:《算法闯关指南:优选算法--二分查找》--17.二分查找(附二分查找算法简介),18. 在排序数组中查找元素的第一个和最后一个位置

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025.11 模拟赛日志

TBD(广东实验集训)2025.11 模拟赛日志 目录2025.11 模拟赛日志CSP-S 202525noip二十连测day13(20251103)25noip二十连测day14(20251104)25noip二十连测day15(20251105)25noip二十连测day16(20251106) CSP-S …

facefusion本地部署环境配置

facefusion本地部署环境配置facefusion本地部署环境配置我使用的facefusion版本是3.4.2升级到3.5.0,以下内容对这两个版本都适用 如果没有具有cuda的英伟达显卡,则后续关于GPU的不需要操作电脑系统信息 系统:版本 W…

2025年知名的304不锈钢带厂家推荐及采购参考

2025年知名的304不锈钢带厂家推荐及采购参考 不锈钢带作为工业制造中的重要原材料,广泛应用于机械制造、石油化工、电力设备、医疗器械、厨具制造等领域。304不锈钢带因其优异的耐腐蚀性、高强度和良好的加工性能,成…

完整教程:基于java的ssm框架舞蹈网站

完整教程:基于java的ssm框架舞蹈网站pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

2025年优质的液压矫平机厂家实力及用户口碑排行榜

2025年优质的液压矫平机厂家实力及用户口碑排行榜在金属加工行业中,液压矫平机作为提升板材和型材平面度、直线度的关键设备,其性能和质量直接影响最终产品的精度与品质。随着中国制造业向高质量发展转型,对精密矫平…

CF576D Flights for Regular Customers

题目传送门 有趣的题。 首先容易想到 \(f_{i,j}\) 表示到 \(i\) 走 \(j\) 步是否合法,转移也是容易的,只要 \(j \ge d_z\),那么便可以走第 \(z\) 条边。复杂度 \(Vn\)。 套路的考虑矩阵快速幂,注意到转移矩阵的变化…

2025年口碑好的厨房拉篮厂家推荐及采购参考

2025年口碑好的厨房拉篮厂家推荐及采购参考 厨房拉篮作为现代家居收纳的核心组件,其设计合理性与耐用性直接影响厨房空间的利用效率。随着消费者对品质生活的追求,市场对拉篮的功能性、美观度及品牌服务提出了更高要…

2025年专业的同向锥双螺杆厂家最新推荐排行榜

2025年专业的同向锥双螺杆厂家最新推荐排行榜 同向锥双螺杆挤出机作为橡塑机械行业的核心设备,广泛应用于塑料改性、造粒、混炼等高精度加工领域。随着全球橡塑产业升级,具备高耐磨性、高扭矩承载能力及长寿命的锥双…