享元模式(设计模式)
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享细粒度对象来减少内存使用,从而提高性能。在享元模式中,多个对象可以共享相同的状态以减少内存消耗,特别适合用于大量相似对象的场景。
享元模式的核心思想
享元模式的核心思想是将对象的状态分为内部状态和外部状态:
● 内部状态:对象中可以共享的部分,不会随环境的改变而改变。
● 外部状态:对象中随环境改变而变化的部分,不能被共享。
通过将对象的内部状态和外部状态分离,可以使多个对象共享相同的内部状态,从而减少内存的开销。
享元模式的组成部分
Flyweight(享元接口):定义对象的接口,通过这个接口可以接受外部状态。
ConcreteFlyweight(具体享元类):实现享元接口,并且存储内部状态。
UnsharedConcreteFlyweight(非共享享元类):不被共享的享元对象,一般不会出现在享元工厂中。
FlyweightFactory(享元工厂类):用来创建和管理享元对象,确保合理地共享享元。
享元模式的实现
在 Java 中实现享元模式,可以通过将对象的内部状态和外部状态分离,并使用享元工厂来管理共享的享元对象。下面是一个详细的示例,展示如何在 Java 中实现享元模式。
享元模式示例
我们将创建一个模拟围棋棋子的应用,其中棋子的颜色是内部状态,而棋子的坐标是外部状态。
1. 定义享元接口
// 享元接口
public interface ChessPiece {void place(int x, int y);
}
2. 实现具体享元类
// 具体享元类
public class ConcreteChessPiece implements ChessPiece {private final String color; // 内部状态public ConcreteChessPiece(String color) {this.color = color;}@Overridepublic void place(int x, int y) {System.out.println("Placing a " + color + " piece at (" + x + ", " + y + ")");}
}
3. 创建享元工厂类
import java.util.HashMap;
import java.util.Map;// 享元工厂类
public class ChessPieceFactory {private static final Map<String, ChessPiece> pieces = new HashMap<>();public static ChessPiece getChessPiece(String color) {ChessPiece piece = pieces.get(color);if (piece == null) {piece = new ConcreteChessPiece(color);pieces.put(color, piece);}return piece;}
}
4. 客户端代码
public class FlyweightPatternDemo {public static void main(String[] args) {ChessPiece blackPiece1 = ChessPieceFactory.getChessPiece("Black");blackPiece1.place(1, 1);ChessPiece blackPiece2 = ChessPieceFactory.getChessPiece("Black");blackPiece2.place(2, 2);ChessPiece whitePiece1 = ChessPieceFactory.getChessPiece("White");whitePiece1.place(3, 3);ChessPiece whitePiece2 = ChessPieceFactory.getChessPiece("White");whitePiece2.place(4, 4);System.out.println("blackPiece1 and blackPiece2 are the same instance: " + (blackPiece1 == blackPiece2));System.out.println("whitePiece1 and whitePiece2 are the same instance: " + (whitePiece1 == whitePiece2));}
}
运行结果
Placing a Black piece at (1, 1)
Placing a Black piece at (2, 2)
Placing a White piece at (3, 3)
Placing a White piece at (4, 4)
blackPiece1 and blackPiece2 are the same instance: true
whitePiece1 and whitePiece2 are the same instance: true
享元模式总结
在这个示例中,我们通过享元模式有效地减少了棋子对象的创建次数。享元工厂负责创建和管理享元对象,并确保每种颜色的棋子只有一个实例,从而节省内存。棋子的颜色作为内部状态被共享,而棋子的坐标作为外部状态由客户端提供。
享元模式的优缺点
优点:
减少对象的创建,降低内存消耗,提高系统性能。
提高了系统的可扩展性。
缺点:
使系统更加复杂,需要额外的代码来管理内部状态和外部状态的分离。
不适合内外状态较为复杂且不同的对象。
适用场景
享元模式适用于以下场景:
系统中存在大量相似对象,导致内存开销大。
对象的大部分状态可以外部化。
需要缓冲池的场景。
对象的状态可以分为内部状态和外部状态,并且内部状态可以共享。
通过使用享元模式,可以显著减少对象的数量,提高系统性能,特别是在需要大量细粒度对象的应用场景中。
相关文章:
享元模式(设计模式)
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享细粒度对象来减少内存使用,从而提高性能。在享元模式中,多个对象可以共享相同的状态以减少内存消耗,特别适合用于大量相似对象的场景。 享元模…...
【机器学习】大模型训练的深入探讨——Fine-tuning技术阐述与Dify平台介绍
目录 引言 Fine-tuning技术的原理阐 预训练模型 迁移学习 模型初始化 模型微调 超参数调整 任务设计 数学模型公式 Dify平台介绍 Dify部署 创建AI 接入大模型api 选择知识库 个人主页链接:东洛的克莱斯韦克-CSDN博客 引言 Fine-tuning技术允许用户根…...
【Linux从入门到放弃】探究进程如何退出以进程等待的前因后果
🧑💻作者: 情话0.0 📝专栏:《Linux从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! 进…...
QT5 static_cast实现显示类型转换
QT5 static_cast实现显示类型转换,解决信号重载情况...
【ES】--Elasticsearch的翻页详解
目录 一、前言二、from+size浅分页1、from+size导致深度分页问题三、scroll深分页1、scroll原理2、scroll可以返回总计数量四、search_after深分页1、search_after避免深度分页问题一、前言 ES的分页常见的主要有三种方式:from+size浅分页、scroll深分页、search_after分页。…...
3.js - 纹理的重复、偏移、修改中心点、旋转
你瞅啥 上字母 // ts-nocheck // 引入three.js import * as THREE from three // 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls // 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js // 导入twee…...
RS232隔离器的使用
RS232隔离器在通信系统中扮演着至关重要的角色,其主要作用可以归纳如下: 一、保护通信设备 电气隔离:RS232隔离器通过光电隔离技术,将RS-232接口两端的设备电气完全隔离,从而避免了地线回路电压、浪涌、感应雷击、静电…...
一切为了安全丨2024中国应急(消防)品牌巡展武汉站成功召开!
消防品牌巡展武汉站 6月28日,由中国安全产业协会指导,中国安全产业协会应急创新分会、应急救援产业网联合主办,湖北消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-武汉站成功举办。该巡展旨在展示中国应急(消防&am…...
【面试系列】PHP 高频面试题
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…...
JAVA极简图书管理系统,初识springboot后端项目
前提条件: 具备基础的springboot 知识 Java基础 废话不多说! 创建项目 配置所需环境 将application.properties>application.yml 配置以下环境 数据库连接MySQL 自己创建的数据库名称为book_test server:port: 8080 spring:datasource:url:…...
MySQL 重新初始化实例
1、关闭mysql服务 service mysqld stop 2、清理datadir(本例中指定的是/var/lib/mysql)指定的目录下的文件,将该目录下的所有文件删除或移动至其他位置 cd /var/lib/mysql mv * /opt/mysql_back/ 3、初始化实例 /usr/local/mysql/bin/mysqld --initialize --u…...
VCS编译bug汇总
‘typedef’ is not expected to be used in this contex 注册前少了分号。 Scope resolution error resolution : 声明指针时 不能与类名同名,即 不能声明为adapter. cannot find member "type_id" 忘记注册了 拼接运算符使用 关键要加上1b࿰…...
【2024LLM应用-数据预处理】之如何从PDF,PPT等非结构化数据提取有效信息(结构化数据JSON)?
🥰大家知道吗,之前在给AI大模型"喂数据"的时候,我们往往需要把非结构化数据(比如PDF、PPT、Excel等)自己手动转成结构化的格式,这可真是太累人儿了。🥵 幸好现在有了Unstructured这个神级库,它内置的数据提取函数可以帮我们快速高效地完成这个…...
冯雷老师:618大退货事件分析
近日冯雷老师受邀为某头部电商36名高管进行培训,其中聊到了今年618退货潮的问题。以下内容整理自冯雷老师的部分授课内容。 一、引言 随着电子商务的蓬勃发展,每年的618大促已成为消费者和商家共同关注的焦点。然而,在销售额不断攀升的同时…...
JAVA基础教程DAY0-基础知识
JAVA语言的特点 简单性、面向对象、安全性、跨平台性、支持多线程、分布性 面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它通过将数据和操作这些数据的方法封装在一起,以创建对象的形式来组织代…...
鸿蒙开发Ability Kit(程序访问控制):【安全控件概述】
安全控件概述 安全控件是系统提供的一组系统实现的ArkUI组件,应用集成这类组件就可以实现在用户点击后自动授权,而无需弹窗授权。它们可以作为一种“特殊的按钮”融入应用页面,实现用户点击即许可的设计思路。 相较于动态申请权限的方式&am…...
【信息系统项目管理师】18年~23年案例概念型知识
文章目录 18上18下19上19下20上20下21上21下22年上22年下23年上 18上 请简述 ISO 9000 质量管理的原则 领导作用、 过程方法、 管理的系统方法、 与供方互利的关系、 基于事实的决策方法、 持续改进、 全员参与、 以顾客为关注焦点 概念 国家标准(GB/T 1 9000 2008)对质量的定…...
什么是字符串常量池?如何利用它来节省内存?
字符串常量池是Java中一个非常重要的概念,尤其对于理解内存管理和性能优化至关重要。想象一下,你正在管理一家大型图书馆,每天都有无数读者来借阅书籍。 如果每本书每次借阅都需要重新印刷一本,那么图书馆很快就会陷入混乱&#…...
Selenium自动化测试20条常见异常+处理方案
常见的Selenium异常 以下是所有Selenium WebDriver代码中可能发生的一些常见Selenium异常。 1、ElementClickInterceptedException 由于以某种方式隐藏了接收到click命令的元素,因此无法正确执行Element Click命令。 2、ElementNotInteractableException 即使目…...
verilog将信号和常数拼接起来
正确的拼接 1 s_axis_data_tdata {32b0000_0000_0000_0000_0000_0000_0000_0000,32b0011_1111_1000_0000_0000_0000_0000_0000}; 2 注意,信号的两部分都要用{}花括号括起来 s_axis_data_tdata {{32{1b1}},{32b0100_0000_0000_0000_0000_0000_0000_0000}}; 3…...
ARM RealView Developer Kit v2.2安装与配置指南
1. RealView Developer Kit v2.2环境准备与系统要求作为ARM早期推出的经典开发套件,RealView Developer Kit v2.2(以下简称RVDK)主要面向Philips系列芯片的嵌入式开发。在开始安装前,需要确认开发环境满足以下基础条件:…...
FT232H芯片应用指南:从USB转串口到SPI/I2C协议模拟
1. 项目概述:从USB到万能的串行接口如果你玩过Arduino或者树莓派,肯定对USB转串口模块不陌生。它就像一座桥梁,让电脑能和那些只懂“嘀嘀嗒嗒”串行语言的硬件设备说上话。但传统的USB转串口芯片,比如常见的CH340或者FT232R&#…...
OBS-VST:专业音频插件集成架构深度解析
OBS-VST:专业音频插件集成架构深度解析 【免费下载链接】obs-vst Use VST plugins in OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-vst OBS-VST 是一款革命性的开源插件,它将专业数字音频工作站的强大能力引入到OBS Studio中࿰…...
Adafruit 3.5寸TFT触摸屏驱动指南:SPI与8位并行模式详解
1. 项目概述与核心价值如果你正在为你的Arduino、树莓派Pico或者任何一款微控制器项目寻找一块足够大、足够亮、还能用手指戳戳点点的屏幕,那么Adafruit这块3.5英寸的320x480彩色TFT触摸屏绝对是一个让人眼前一亮的选择。我手头经手过不少显示屏,从单色O…...
使用 SaySo 语音输入提升内容创作效率,从灵感到初稿的工作流实践
作为一个日更科技内容创作者,我每天都需要完成大量文字输出。包括工具测评、产品体验、干货笔记、技术趋势观察,以及一些观点类内容。长期写下来之后,我发现真正消耗时间的,不只是选题和思考,还有一个很容易被忽略的环…...
别再一个个点菜单了!MathType 7.4.8快捷键保姆级清单,效率翻倍不是梦
MathType 7.4.8快捷键全攻略:从入门到精通的效率革命 在数学公式编辑的世界里,每个操作都像是一场与时间的赛跑。当你在深夜赶论文时,当你在实验室紧急修改报告时,那些隐藏在菜单深处的功能是否让你感到焦躁?MathType作…...
如何实现数字孪生在智慧建筑中的应用?
一、搭建建筑数字底座以BIM 建筑信息模型为核心,对楼宇结构、楼层房间、机电设备、地下管网进行1:1 三维精细化建模,并完成模型轻量化处理,构建建筑全域三维数字底盘。二、多源感知数据接入在建筑内部部署温湿度、烟感、门禁、摄像头、水电表…...
Linux下串口连接与CircuitPython开发实战指南
1. 项目概述:为什么串口是嵌入式开发的“生命线” 如果你玩过Arduino、树莓派Pico,或者正在捣鼓CircuitPython开发板,那么“串口”这个词对你来说一定不陌生。它就像一条看不见的数据管道,连接着你的电脑和那块小小的开发板。在W…...
ESP32-C6与CircuitPython:物联网开发入门与实战指南
1. ESP32-C6与CircuitPython:为什么是嵌入式开发的“黄金搭档”?如果你刚拿到一块ESP32-C6开发板,面对一堆引脚和陌生的术语,可能会有点无从下手。别担心,这种感觉每个硬件开发者都经历过。嵌入式开发听起来高深&#…...
嵌入式系统I2S音频与异步编程实战:CircuitPython下的多任务并发
1. 项目概述:当嵌入式系统学会“听”与“说”在嵌入式开发的世界里,让一块小小的开发板“发声”和“同时处理多件事”,曾经是相当有挑战性的任务。前者需要处理复杂的数字音频协议,后者则考验着在单线程、资源受限环境下的编程智慧…...
