享元模式(设计模式)
享元模式(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…...
csvlens作为库使用教程:在Rust项目中集成CSV查看功能
csvlens作为库使用教程:在Rust项目中集成CSV查看功能 【免费下载链接】csvlens Command line csv viewer 项目地址: https://gitcode.com/gh_mirrors/cs/csvlens 想要在你的Rust应用中添加一个功能强大、交互式的CSV数据查看器吗?csvlens不仅是一…...
常见开源软件协议介绍
在当今数字化时代,开源软件如同一股洪流,席卷了整个技术领域。从我们日常使用的操作系统,到复杂的大数据处理框架,开源软件无处不在。然而,在这繁荣的开源生态背后,有一群默默守护规则的 “卫士”ÿ…...
2025年阿里云幻兽帕鲁联机服务器极速搭建指南
1. 为什么选择阿里云搭建幻兽帕鲁服务器? 最近很多朋友问我,为什么非要选择阿里云来搭建幻兽帕鲁的联机服务器?作为一个从游戏测试阶段就开始折腾服务器搭建的老玩家,我总结了几个关键原因。首先,阿里云的游戏服务器专…...
Keil工程管理效率翻倍:Python脚本实现构建结果自动归档与HTML报告生成
Keil工程管理效率翻倍:Python脚本实现构建结果自动归档与HTML报告生成 在嵌入式开发领域,Keil作为主流开发工具链的核心组件,其工程管理效率直接影响着团队协作和产品迭代速度。传统开发流程中,工程师往往需要手动收集每次构建生成…...
VisionPro实战:CogGraphicCollection在工业检测中的5个高效用法(附代码)
VisionPro实战:CogGraphicCollection在工业检测中的5个高效用法(附代码) 在工业自动化领域,机器视觉系统正变得越来越智能和高效。作为康耐视VisionPro平台的核心组件之一,CogGraphicCollection为工程师提供了强大的图…...
不止于复现:用Fluent UDF模拟化学反应放热的3个高级技巧与收敛性优化
不止于复现:用Fluent UDF模拟化学反应放热的3个高级技巧与收敛性优化 在储氢反应器仿真领域,许多工程师能够完成基础的能量源项UDF加载,却常常陷入残差震荡、计算结果失真的困境。本文将从三个实战维度,分享如何让化学反应放热模拟…...
OpenClaw本地模型成本对比:nanobot镜像vs商业API实测
OpenClaw本地模型成本对比:nanobot镜像vs商业API实测 1. 为什么需要关注OpenClaw的模型成本 上周我在尝试用OpenClaw自动化处理200份PDF文档时,意外发现账单上出现了三位数的API费用。这个数字让我意识到——当OpenClaw需要频繁调用大模型进行决策时&a…...
多模态数据挖掘前沿:生物医学与情感分析领域论文深度解析
多模态数据挖掘前沿:生物医学与情感分析领域论文深度解析 在人工智能与大数据技术飞速发展的当下,多模态数据因能更全面、立体地刻画研究对象,已成为科研领域的核心研究方向。本文将深度解析两篇聚焦多模态数据挖掘的重磅论文——《多模态生物…...
降AIGC哪家强?2026零成本保姆级教程:DeepSeek/Kimi/豆包专属降重指令实测与差异解析
很多时候大学生写论文逻辑太严谨、话术太规范,反而会导致AI率过高,且一旦AI率过高,轻则退回重改,重则取消答辩资格,这后果谁都担不起。 为了帮大家有效降低aigc率,这周我专门针对目前市面上最主流的三款大…...
嵌入式正交编码器软件解码库设计与实现
1. QuadratureEncoder 库概述QuadratureEncoder 是一个专为嵌入式系统设计的正交编码器信号处理库,面向 STM32、ESP32、nRF52 等主流 MCU 平台,提供高精度、低开销、抗干扰的旋转位置与速度检测能力。该库不依赖特定硬件外设(如 STM32 的 TIM…...
