当前位置: 首页 > article >正文

Java 设计模式之享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) 是一种 结构型设计模式,旨在通过共享对象来有效支持大量细粒度对象的复用,从而减少内存占用和提高性能。其核心是 分离内部状态(可共享)与外部状态(不可共享),适用于存在大量重复对象且对象的大部分状态可以外部化的场景。

1. 核心角色

角色说明
享元接口(Flyweight)定义对象的方法,通常包含接收外部状态的操作。
具体享元类(Concrete Flyweight)实现享元接口,存储内部状态(可共享部分)。
享元工厂(Flyweight Factory)管理享元对象池,确保相同内部状态的对象唯一。
客户端(Client)维护外部状态,通过享元工厂获取对象并传递外部状态。

2. 代码示例:图形编辑器中的树对象

假设需要绘制大量树(Tree)对象,树的类型(名称、颜色)可共享,位置和年龄为外部状态。

步骤1:定义享元接口
步骤2:实现具体享元类
步骤3:实现享元工厂
步骤4:客户端使用
输出结果

3. 享元模式类图

4. 享元模式优缺点

优点缺点
减少内存占用,提升性能。增加系统复杂度(需分离内外部状态)。
支持大量细粒度对象的高效管理。线程安全问题需额外处理(如工厂类)。

5. 内部状态 vs. 外部状态

状态类型说明
内部状态(Intrinsic)对象可共享的部分,独立于使用场景(如树的类型、颜色)。
外部状态(Extrinsic)对象不可共享的部分,随上下文变化(如树的位置、年龄)。

6. 实际应用场景

  1. 文本编辑器

    • 内部状态:字符的字体、颜色、大小。

    • 外部状态:字符在文档中的位置。

  2. 游戏开发

    • 内部状态:子弹类型、纹理。

    • 外部状态:子弹的位置、速度。

  3. Java 字符串池

    • String 类的常量池是享元模式的典型实现,相同字面量的字符串对象被复用。


7. 享元模式 vs. 其他模式

模式区别
单例模式单例确保全局唯一实例;享元允许存在多个实例,但相同内部状态的实例被共享。
对象池模式对象池复用对象生命周期;享元复用对象内部状态。

8. 总结

  • 核心思想:通过共享内部状态减少对象数量,外部状态由客户端传递。

  • 关键实现:享元工厂管理共享对象池,确保唯一性。

  • 适用场景:存在大量相似对象且内存占用是瓶颈时优先考虑。

相关文章:

Java 设计模式之享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern) 是一种 结构型设计模式,旨在通过共享对象来有效支持大量细粒度对象的复用,从而减少内存占用和提高性能。其核心是 分离内部状态(可共享)与外部状态(不可共享&#…...

C#入门学习记录(三)C#中的隐式和显示转换

C#类型转换:隐式与显式转换的机制与应用 在C#的强类型体系中,数据类型转换是实现数据交互和算法逻辑的基础操作。当数值类型范围存在包含关系,或对象类型存在继承层次时,系统通过预定义的转换规则实现类型兼容处理。隐式转换&…...

Rk3568驱动开发_设备树_9

什么是设备树? 以我目前的理解,设备树更像日常生活中用的地图,用户能根据地图去寻找到相应位置 设备树也是如此它描述了硬件设备的连接关系和配置信息,供 CPU(或者更准确地说,是操作系统内核)…...

一和零 (leetcode 474

leetcode系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 本题是一个01背包问题,只是背包是一个二维数组的背包,分别为0的个数不能超过m,1的个数不能超过n,而物品就是题目中的字符串,其容量为0和1的…...

深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)

原文链接:从零开始的DeepSeek微调训练实战(SFT) 微调参考示例:由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…...

【AI News | 20250320】每日AI进展

AI Repos 1、servers 该仓库提供详细入门指南,用户可通过简单步骤连接Claude客户端,快速使用所有服务器功能。此项目由Anthropic管理,展示MCP的多样性与扩展性,助力开发者为大语言模型提供安全、可控的工具与数据访问。 2、awe…...

从零开始实现 C++ TinyWebServer 阻塞队列 BlockQueue类详解

文章目录 阻塞队列是什么?为什么需要阻塞队列?BlockQueue 成员变量实现 push() 函数实现 pop() 函数实现 close() 函数BlockQueue 代码BlockQueue 测试 从零开始实现 C TinyWebServer 项目总览 项目源码 阻塞队列是什么? 阻塞队列是一种线程…...

Linux驱动开发基础(can)

目录 1.can的介绍 2.can的硬件连接 2.1 CPU自带can控制器 2.2 CPU没有can控制器 3.电气属性 4.can的特点 5.can协议 5.1 can的种类 5.2 数据帧 5.2.1 标准数据帧格式 5.3.1 扩展数据帧格式 5.3 遥控帧 5.4 错误帧 5.5 过载帧 5.6 帧间隔 5.7 位填充 5.8 位时…...

5.2《生活中的透镜》——5.3《凸透镜成像规律》讲后再上

教会什么:照相机、投影仪、放大镜的原理 培养什么:(再说) 课标: (二)运动和相互作用 2.3 声和光 2.3.5了解凸透镜成像规律的应用。 例7 了解凸透镜成像规律在放大镜、照相机中的应用。 一、导入 提问:生活中有哪些透镜?(放大镜、照相机、投影仪/幻灯机) ——直接提出…...

【LangChain入门 3 Prompts组件】聊天提示词模板 ChatPromptTemplate

文章目录 一、 聊天信息提示词模板1.1 使用关键字1.2 使用SystemMessage, HumanMessage, AIMessage来定义消息1.3 使用MessagesPlaceholder 在特定未知添加消息列表 二、关键类介绍2.1 ChatPromptTemplate 类2.1.1 from_messages()2.1.2 format_messages()2.1.3 format_prompt(…...

fastadmin后台管理员日志指定方法不记录

做的订单提醒,只要在线会把日志自动存储进去,这个又是每30s执行一次,数据库没多久就爆掉了,最终找到一个处理方法,可能不是最好的,仅供大家参考 具体位置: application/admin/model/AdminLog.php里面的$ignoreRegex方法 protected static $ignoreRegex [/^(.*)\/(selectpage…...

leetcode热题100道——字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &…...

MCU-芯片时钟与总线和定时器关系,举例QSPI

时钟源: 时钟源为系统时钟提供原始频率信号,系统时钟则通过(分频、倍频、选择器)成为整个芯片的“主时钟”,驱动 CPU 内核、总线(AHB、APB)及外设的运行。 内部时钟源: HSI&#x…...

力扣热题100(方便自己复习,自用)

力扣热题100 1. 两数之和 - 力扣(LeetCode) 查找两数之和是不是等于target也就是我们找到一个数之后,用target将其减掉,再寻找应当对应的元素是什么每找到一个数,我们就将其放在集合中,因为集合中可以去重…...

暂存合并分支

合并分支代码,冲突过多,没解决完 想切换分支,可以把合并暂存 先先 git add . 再git stash 恢复搁置: 查看当前的搁置列表: git stash list恢复特定的搁置 如果你想恢复特定的搁置更改,可以指定索引&a…...

力扣hot100——三数之和(双指针)

题目:三数之和 排序 双指针 本题的难点在于如何去除重复解。 算法流程: 1、特判,对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回 []。 2、对数组进行排序。 3、遍历排序后数组: &#xff08…...

技术分享 | MySQL内存使用率高问题排查

本文为墨天轮数据库管理服务团队第51期技术分享,内容原创,如需转载请联系小墨(VX:modb666)并注明来源。 一、问题现象 问题实例mysql进程实际内存使用率过高 二、问题排查 2.1 参数检查 mysql版本 :8.0.…...

分享一个精灵图生成和拆分的实现

概述 精灵图(Sprite)是一种将多个小图像合并到单个图像文件中的技术,广泛应用于网页开发、游戏开发和UI设计中。在MapboxGL中,跟之配套的还有一个json文件用来记录图标的大小和位置。本文分享基于Node和sharp库实现精灵图的合并与…...

AI日报 - 2025年3月21日

🌟 今日概览(60秒速览) ▎🤖 AGI突破 | OpenAI成立安全委员会,加速AGI治理框架构建 ▎💼 商业动向 | 微软发布医疗大模型DAX Copilot 3.0,覆盖全球临床场景 ▎📜 政策追踪 | 中国发布…...

MongoDB 配合python使用的入门教程

MongoDB 入门教程 1. 安装 MongoDB 首先,你需要在你的机器上安装MongoDB。你可以从 MongoDB官网 下载并安装 Community 版本。安装完成后,启动MongoDB服务。 # 在Linux/Mac上启动MongoDB mongod# 在Windows上,你可以通过Windows服务启动Mo…...

函数:形参和实参

在函数的使用过程中分为实参和形参,实参是主函数实际调用的值而形参则是给实参调用的值,如果函数没被调用则函式不会向内存申请空间,先用一段代码演示 形参: int test(int x ,int y ) {int z 0;z x y;return z; } 为何会叫做…...

【C#知识点详解】ExcelDataReader介绍

今天来给大家介绍一下ExcelDataReader,ExcelDataReader是一个轻量级的可快速读取Excel文件中数据的工具。话不多说直接开始。 ExcelDataReader简介 ExcelDataReader支持.xlsx、.xlsb、.xls、.csv格式文件的读取,版本基本在2007及以上版本,支…...

Vala编程语言教程-控制结构

控制结构 while (a > b) { a--; } 会重复递减a&#xff0c;每次迭代前检查a是否大于b。 do { a--; } while (a > b); 会重复递减a&#xff0c;每次迭代后检查a是否大于b。 for (int a 0; a < 10; a) { stdout.printf("%d\n", a); } 会先将a初始化为0…...

《视觉SLAM十四讲》ch13 设计SLAM系统 相机轨迹实现

前言 相信大家在slam学习中&#xff0c;一定会遇到slam系统的性能评估问题。虽然有EVO这样的开源评估工具&#xff0c;我们也需要自己了解系统生成的trajectory.txt的含义&#xff0c;方便我们更好的理解相机的运行跟踪过程。 项目配置如下&#xff1a; 数据解读&#xff1a; …...

服务的拆分数据的迁移

参考&#xff1a; 数据迁移调研...

在类Unix终端中如何实现快速进入新建目录

&#x1f6aa; 前言 相信喜欢使用终端工作的小伙伴或多或少会被一个小地方给膈应&#xff0c;那就是每次想要新建一个文件夹并且进入之&#xff0c;那么就需要两条指令&#xff1a;mkdir DIR和cd DIR&#xff0c;有些人可能要杠了&#xff0c;我一条指令也能&#xff0c;mkdir…...

01分数规划,二分法,题目练习

一、01分数规划 1.1 01分数规划 01分数规划用来求一个分式的极值。模型如下&#xff1a; 给出 a i a_i ai​ 和 b i b_i bi​&#xff0c;求一组 w i ∈ { 0 , 1 } w_i \in \{ 0, 1 \} wi​∈{0,1}最小化或最大化 ∑ i 1 n a i w i ∑ i 1 n b i w i \frac{\sum_{i1…...

TG电报群管理机器人定制开发的重要性

在Telegram&#xff08;电报&#xff09;用户突破20亿、中文社群规模持续扩张的背景下&#xff0c;定制化群管理机器人的开发已成为社群运营的战略刚需。这种技术工具不仅解决了海量用户管理的效率难题&#xff0c;更通过智能化功能重构了数字社群的治理范式。本文从管理效能、…...

VNA操作使用学习-01 界面说明

以我手里面的liteVNA为例。也可以参考其他的nanoVNA的操作说明。我先了解一下具体的菜单意思。 今天我想做一个天调&#xff0c;居然发现我连一颗基本的50欧姆插件电阻和50欧姆的smt电阻的幅频特性都没有去测试过&#xff0c;那买来这个nva有什么用途呢&#xff0c;束之高阁求…...

mysql-DELETE、DROP 和 TRUNCATE区别

在MySQL中&#xff0c;DELETE、DROP 和 TRUNCATE 是用于不同目的的SQL命令&#xff0c;它们各自执行不同的数据库操作。以下是它们的区别和适用场景&#xff1a; DELETE 用途&#xff1a;用于从表中删除满足特定条件的行。语法示例&#xff1a;DELETE FROM table_name WHERE …...