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

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

亨元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来最大限度地减少内存使用和提高性能。该模式适用于需要创建大量相似对象的情况,其中许多对象具有相同的状态。通过共享相同的状态,亨元模式可以减少内存消耗,并使对象的创建和管理更加高效。

以下是亨元模式的几个关键角色:

  • 亨元(Flyweight):表示一个共享的对象,存储了内部状态和外部状态。内部状态是指对象共享的部分,而外部状态是对象的变化部分,需要在运行时进行传递。
  • 亨元工厂(Flyweight Factory):负责创建和管理亨元对象。它维护一个亨元池(Flyweight Pool)用于存储已经创建的亨元对象,并根据客户端的请求返回相应的亨元对象。

下面是一个示例,展示了如何使用亨元模式来共享相同的字符串对象:

import java.util.HashMap;
import java.util.Map;// 亨元接口
interface Flyweight {void display();
}// 具体的亨元实现类
class ConcreteFlyweight implements Flyweight {private String intrinsicState;public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}public void display() {System.out.println("Intrinsic State: " + intrinsicState);}
}// 亨元工厂类
class FlyweightFactory {private Map<String, Flyweight> flyweightPool;public FlyweightFactory() {flyweightPool = new HashMap<>();}public Flyweight getFlyweight(String key) {if (flyweightPool.containsKey(key)) {return flyweightPool.get(key);} else {Flyweight flyweight = new ConcreteFlyweight(key);flyweightPool.put(key, flyweight);return flyweight;}}
}// 客户端代码
public class Client {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();// 获取共享对象Flyweight flyweight1 = factory.getFlyweight("A");Flyweight flyweight2 = factory.getFlyweight("B");Flyweight flyweight3 = factory.getFlyweight("A");// 调用共享对象的方法flyweight1.display();  // 输出:"Intrinsic State: A"flyweight2.display();  // 输出:"Intrinsic State: B"flyweight3.display();  // 输出:"Intrinsic State: A"// 验证对象是否为同一个对象System.out.println(flyweight1 == flyweight2);  // 输出:falseSystem.out.println(flyweight1 == flyweight3);  // 输出:true}
}

在上述示例中,ConcreteFlyweight 表示具体的亨元实现类,它包含了一个内部状态 intrinsicState,用于存储共享的状态。FlyweightFactory 是亨元工厂类,负责创建和管理亨元对象。它维护了一个 flyweightPool 用于存储已经创建的亨元对象,并根据客户端的请求返回相应的亨元对象。

在客户端代码中,通过亨元工厂获取共享对象,并调用其方法。可以看到,虽然创建了两个具有相同内部状态的亨元对象,但实际上它们是同一个对象,因为它们共享相同的状态。这样可以减少内存消耗,并提高性能。

亨元模式在需要创建大量相似对象且内部状态可以共享的场景中非常有用,它能够有效地提高系统的性能和资源利用率。

相关文章:

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

亨元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享对象来最大限度地减少内存使用和提高性能。该模式适用于需要创建大量相似对象的情况&#xff0c;其中许多对象具有相同的状态。通过共享相同的状态&#xff0c;亨元模式可以减少…...

正点原子嵌入式linux驱动开发——Linux中断

不管是单片机裸机实验还是Linux下的驱动实验&#xff0c;中断都是频繁使用的功能&#xff0c;在裸机中使用中断需要做一大堆的工作&#xff0c;比如配置寄存器&#xff0c;使能IRQ等等。但是Linux内核提供了完善的中断框架&#xff0c;只需要申请中断&#xff0c;然后注册中断处…...

基于Jaya优化算法的电力系统最优潮流研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Write-Ahead Log(PostgreSQL 14 Internals翻译版)

日志 如果发生停电、操作系统错误或数据库服务器崩溃等故障&#xff0c;RAM中的所有内容都将丢失&#xff1b;只有写入磁盘的数据才会被保留。要在故障后启动服务器&#xff0c;必须恢复数据一致性。如果磁盘本身已损坏&#xff0c;则必须通过备份恢复来解决相同的问题。 理论…...

CUDA 学习记录

1.关于volatile&#xff1a; 对于文章中这个函数&#xff0c; __global__ void reduceUnrollWarps8 (int *g_idata, int *g_odata, unsigned int n) {// set thread IDunsigned int tid threadIdx.x;unsigned int idx blockIdx.x * blockDim.x * 8 threadIdx.x;// convert…...

【Java 进阶篇】深入了解 Bootstrap 按钮和图标

按钮和图标在网页设计中扮演着重要的角色&#xff0c;它们是用户与网站或应用程序交互的关键元素之一。Bootstrap 是一个流行的前端框架&#xff0c;提供了丰富的按钮样式和图标库&#xff0c;使开发者能够轻松创建吸引人的界面。在本文中&#xff0c;我们将深入探讨 Bootstrap…...

基于Java的人事管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…...

代码随想录算法训练营第五十九天| 647. 回文子串 516.最长回文子序列

今日学习的文章链接和视频链接 回文子串 https://programmercarl.com/0647.%E5%9B%9E%E6%96%87%E5%AD%90%E4%B8%B2.html 516.最长回文子序列 https://programmercarl.com/0516.%E6%9C%80%E9%95%BF%E5%9B%9E%E6%96%87%E5%AD%90%E5%BA%8F%E5%88%97.html 动态规划总结篇 https:…...

uniapp 小程序优惠劵样式

先看效果图 上代码 <view class"coupon"><view class"tickets" v-for"(item,index) in 10" :key"item"><view class"l-tickets"><view class"name">10元优惠劵</view><view cl…...

元梦之星内测上线,如何在B站打响声量?

元梦之星是腾讯天美工作室群研发的超开星乐园派对手游&#xff0c;于2023年1月17日通过审批。该游戏风格可爱软萌&#xff0c;带有社交属性&#xff0c;又是一款开黑聚会的手游&#xff0c;备受年轻人关注。 飞瓜数据&#xff08;B站版&#xff09;显示&#xff0c;元梦之星在…...

Python---循环---while循环

Python中的循环 包括 while循环与for循环&#xff0c;本文以while循环为主。 Python中所有的知识点&#xff0c;都是为了解决某个问题诞生的&#xff0c;就好比中文的汉字&#xff0c;每个汉字都是为了解决某种意思表达而诞生的。 1、什么是循环 现实生活中&#xff0c;也有…...

面试知识点--基础篇

文章目录 前言一、排序1. 冒泡排序2. 选择排序3. 插入排序4. 快速单边循环排序5. 快速双边循环排序6. 二分查找 二、集合1.List2.Map 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、排序 1. 冒泡排序 冒泡排序就是把小的元素往前调或者把大…...

FIFO设计16*8,verilog,源码和视频

名称&#xff1a;FIFO设计16*8&#xff0c;数据显示在数码管 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 使用verilog语言设计一个16*8的FIFO&#xff0c;深度16&#xff0c;宽度为8。可对FIFO进行写和读&#xff0c;并将FIFO读出的数据显示到…...

#力扣:2769. 找出最大的可达成数字@FDDLC

2769. 找出最大的可达成数字 - 力扣&#xff08;LeetCode&#xff09; 一、Java class Solution {public int theMaximumAchievableX(int num, int t) {return num 2*t;} }...

Juniper防火墙SSG-140 session 过高问题

1.SSG-140性能参数 2.问题截图 3.解决方法 &#xff08;1&#xff09;通过telnet 或 consol的方法登录到防火墙&#xff1b; &#xff08;2&#xff09;使用get session 查看总的session会话数&#xff0c;如果大于300 一般属于不正常情况 &#xff08;3&#xff09;使用get…...

Spring Boot 3.2四个新特点提升运行性能

随着 Spring Framework 6.1 和 Spring Boot 3.2 普遍可用性的临近&#xff0c;我们想分享一下 Spring 团队为让开发人员优化其应用程序的运行时效率而做出的几项努力的概述。 我们将介绍以下技术和用例&#xff1a; Spring MVC 将使用 基于JDK 21 虚拟线程 Web 堆栈使用 Spri…...

一阶系统阶跃响应实现规划方波目标值

一阶系统单位阶跃响应 一阶系统传递函数&#xff0c;实质是一阶惯性环节&#xff0c;T为一阶系统时间常数。 输入信号为单位阶跃函数&#xff0c;数学表达式 单位阶跃函数拉氏变换 输出一阶系统单位阶跃响应 拉普拉斯反变换 使用前向差分法对一阶系统离散化 将z变换写成差分方…...

项目经理如何去拆分复杂项目?

代码的横向分层&#xff0c;维度是根据复杂度来的&#xff0c;可保证代码便于开发和维护 1、因为强类型的原因&#xff0c;把变动大的分到数据库来解决&#xff0c;这是一种后端分离。 2、因为发布难的原因&#xff0c;所以用稳定的引擎来解决问题&#xff0c;然后用数据库配置…...

python二次开发Solidworks:修改实体尺寸

立方体原始尺寸&#xff1a;100mm100mm100mm 修改后尺寸&#xff1a;10mm100mm100mm import win32com.client as win32 import pythoncomdef bin_width(width):myDimension Part.Parameter("D1草图1")myDimension.SystemValue width def bin_length(length):myDime…...

【C++】:类和对象(中)之类的默认成员函数——构造函数and析构函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成…...

Qwen3-0.6B-FP8惊艳效果:软链机制实现模型热切换的5秒操作演示

Qwen3-0.6B-FP8惊艳效果&#xff1a;软链机制实现模型热切换的5秒操作演示 1. 开篇&#xff1a;一个让模型切换像换衣服一样简单的技术 你有没有遇到过这样的场景&#xff1f;部署了一个AI模型&#xff0c;用了一段时间后&#xff0c;发现平台更新了模型权重文件&#xff0c;…...

Python Flask工程目录解读

&#x1f4c1; 项目根目录 usedCar 项目主目录&#xff0c;是整个工程的工作区。&#x1f4c1; applications — 应用核心 Flask 应用的工厂模式组织目录&#xff0c;包含业务应用的初始化、扩展管理和全局配置。子目录/文件作用config.py应用全局配置文件&#xff0c;包含数据…...

C语言完美演绎9-2

/* 范例&#xff1a;9-2 */#include <stdio.h>int a; /* a0 */int sum_a(void){a a 5;return a;}void main(void){a a sum_a(); /* ??猜得到a的值吗?? */printf("a%d\n",a);getchar();}...

机器学习特征选择:随机优化算法原理与实践

1. 特征选择与随机优化算法概述在机器学习项目中&#xff0c;特征选择是提升模型性能的关键预处理步骤。传统方法如过滤式(Filter)和包裹式(Wrapper)特征选择各有局限&#xff1a;前者忽略特征组合效应&#xff0c;后者计算成本高昂。随机优化算法通过引入概率性搜索机制&#…...

SSCom串口调试助手:Linux和macOS下的高效串口通信终极指南

SSCom串口调试助手&#xff1a;Linux和macOS下的高效串口通信终极指南 【免费下载链接】sscom Linux/Mac版本 串口调试助手 项目地址: https://gitcode.com/gh_mirrors/ss/sscom SSCom是一款专为Linux和macOS系统设计的免费串口调试工具&#xff0c;它为嵌入式开发者、物…...

基于PraisonAI的多智能体编排框架:从YAML配置到生产部署全解析

1. 项目概述&#xff1a;当AI遇上AI&#xff0c;一个能指挥大模型的“指挥官”最近在折腾AI应用开发的朋友&#xff0c;可能都遇到过这样的困境&#xff1a;手头有好几个强大的模型&#xff0c;比如OpenAI的GPT-4、Anthropic的Claude&#xff0c;还有开源的Llama 3&#xff0c;…...

AdaGrad算法解析:自适应梯度下降优化原理与实践

1. 梯度下降与AdaGrad算法解析在机器学习领域&#xff0c;优化算法是模型训练的核心引擎。传统梯度下降算法虽然简单有效&#xff0c;但在面对不同维度曲率差异较大的目标函数时&#xff0c;固定学习率的设定往往成为性能瓶颈。想象一下&#xff0c;你在山区徒步时&#xff0c;…...

5个DirectInput转XInput实战技巧:解决老旧游戏手柄兼容性问题的完整指南

5个DirectInput转XInput实战技巧&#xff1a;解决老旧游戏手柄兼容性问题的完整指南 【免费下载链接】XOutput DirectInput to XInput wrapper 项目地址: https://gitcode.com/gh_mirrors/xo/XOutput 你是否曾经遇到过这样的尴尬场景&#xff1a;手中的PS2、PS3手柄或者…...

降AI检测率用什么工具好?率零最低2元/千字,适合本科论文降AI!

一、前言&#xff1a;2026 年毕业必须通过aigc检测 2026年各高校对学术论文的AIGC疑似度的审查全面变严&#xff0c;均发布了具体AIGC检测报告和数值要求&#xff0c;211和985高校规定本科论文AI率要低于20%&#xff0c;硕士要求 AI 率不高于15%。普通高校一般要求AI率控制在 …...

iOS模拟器语音控制:基于Alexa与AWS Lambda的自动化实践

1. 项目概述与核心价值最近在折腾iOS自动化测试和界面调试&#xff0c;发现一个痛点&#xff1a;每次想快速启动一个特定型号的模拟器&#xff0c;都得先打开Xcode&#xff0c;再点开模拟器列表&#xff0c;然后在一堆设备里翻找&#xff0c;效率实在太低。直到我发现了Conor L…...