【设计模式】享元模式

目录

什么是享元模式

代码实现


什么是享元模式

        Java中的享元模式(Flyweight Pattern)是一种结构型设计模式,它用于减少系统中对象的数量,以节省内存和提高性能。享元模式通过共享相似对象之间的公共部分来最小化内存使用。

在享元模式中,有两种类型的对象:

  1. 内部状态(Intrinsic State):是对象的共享部分,可以被多个对象共享。这些状态通常是不变的,并且不依赖于特定的上下文环境。

  2. 外部状态(Extrinsic State):是对象的非共享部分,是对象在特定上下文环境下的变化部分。外部状态需要由客户端来维护和传递。

享元模式的核心思想是将内部状态和外部状态分离。内部状态由享元对象自身管理和维护,而外部状态由客户端来维护和传递。这样可以在一定程度上减少对象的数量,节省内存空间。

享元模式通常包含以下角色:

  • 享元工厂(Flyweight Factory):负责创建和管理享元对象。它维护一个享元池(Flyweight Pool),用于存储已经创建的享元对象,并根据客户端的请求返回相应的享元对象。

  • 抽象享元(Flyweight):定义了享元对象的接口,包含了对内部状态的操作方法。通常是一个接口或抽象类。

  • 具体享元(Concrete Flyweight):实现了抽象享元接口,并为内部状态提供了具体的实现。具体享元对象可以被多个客户端共享。

享元模式的主要优点包括:

  • 减少内存使用:通过共享相似对象的公共部分,减少了系统中对象的数量,节省了内存空间。

  • 提高性能:减少了对象的数量,可以降低系统的运行时开销,提高了系统的性能。

  • 灵活性:客户端可以通过外部状态来改变享元对象的行为,而不需要修改享元对象本身。

享元模式适用于以下情况:

  • 当系统中存在大量相似对象,并且这些对象可以被共享时。

  • 当需要缓存对象以提高性能时,例如在网络请求中缓存已经请求过的数据。

        总之,享元模式是一种非常有用的设计模式,可以帮助我们减少系统中对象的数量,节省内存空间,并提高系统的性能。

代码实现

下面是一个简单的Java代码示例,演示了如何使用享元模式:      

import java.util.HashMap;
import java.util.Map;// 抽象享元接口
interface Flyweight {void operation(String externalState);
}// 具体享元类
class ConcreteFlyweight implements Flyweight {private String intrinsicState;public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}@Overridepublic void operation(String externalState) {System.out.println("ConcreteFlyweight: Intrinsic State - " + intrinsicState + ", Extrinsic State - " + externalState);}
}// 享元工厂类
class FlyweightFactory {private Map<String, Flyweight> flyweights = new HashMap<>();public Flyweight getFlyweight(String key) {if (!flyweights.containsKey(key)) {flyweights.put(key, new ConcreteFlyweight(key));}return flyweights.get(key);}
}// 客户端
public class FlyweightPatternExample {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();// 客户端使用享元对象Flyweight flyweight1 = factory.getFlyweight("key1");flyweight1.operation("externalState1");Flyweight flyweight2 = factory.getFlyweight("key2");flyweight2.operation("externalState2");Flyweight flyweight3 = factory.getFlyweight("key1");flyweight3.operation("externalState3");// 检查是否共享了相同的对象System.out.println("Is flyweight1 the same object as flyweight3? " + (flyweight1 == flyweight3));}
}

        在这个示例中,Flyweight是享元接口,定义了享元对象的操作方法。ConcreteFlyweight是具体享元类,实现了抽象享元接口,并为内部状态提供了具体的实现。FlyweightFactory是享元工厂类,负责创建和管理享元对象。客户端通过工厂类获取享元对象,并传递外部状态给享元对象进行操作。

        在客户端代码中,我们创建了几个享元对象,并为每个对象传递了不同的外部状态。我们还通过工厂类获取了相同的享元对象,并检查它们是否共享了相同的对象。

        非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~

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

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

相关文章

小记一篇 vuecli4项目 打包内存溢出问题

目录 背景先解决内存溢出问题 让项目能够打包打包优化公共第三方模块 提取出来 不走webpack 打包 , 改成 cdn 引入项目中使用 图片等 静态资源 全部走cdn使用thread-loader 开启多线程打包 后序 背景 其他项目组有个项目迭代了3年&#xff0c;突然有一天 vuecli-4 webpack打包…

链表OJ - 6(链表分割)

题目描述&#xff08;来源&#xff09; 现有一链表的头指针 ListNode* pHead&#xff0c;给一定值x&#xff0c;编写一段代码将所有小于x的结点排在其余结点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头指针。 思路 创建两个链表&#xff0c…

【C#】防御性编程策略float.TryParse()

float.TryParse(Result[0].ToString(), out realValue1);这行C#代码用于尝试将一个字符串转换成浮点数&#xff08;float&#xff09;。具体来说&#xff0c;它使用了 float.TryParse 方法&#xff0c;这是一个非常常用的方法&#xff0c;用于在转换时提供错误处理&#xff0c;…

ChatGPT:引领未来的语言模型革命?

一、引言 随着人工智能技术的不断发展&#xff0c;Chat GPT作为一种自然语言处理技术&#xff0c;已经逐渐渗透到各个领域&#xff0c;具有广泛的应用前景。本文将从多个角度探讨Chat GPT的应用领域及其未来发展趋势。 ChatGPT的语言处理能力超越了以往任何一款人工智能产品。…

iOS知识点---Runloop

iOS 中的 Runloop 机制是一种事件驱动模型&#xff0c;用于管理和调度线程上的事件&#xff0c;确保线程在有工作要做时保持活跃&#xff0c;无事可做时进入休眠状态以节省系统资源。以下是 Runloop 机制的关键组成部分及其工作原理&#xff1a; 关键组成部分与原理&#xff1…

Docker一键快速私有化部署(Ollama+Openwebui) +AI大模型(gemma,llama2,qwen)20240417更新

几行命令教你私有化部署自己的AI大模型&#xff0c;每个人都可以有自己的GTP 第一步&#xff1a;安装Docker(如果已经有了可以直接跳第二步) ####下载安装Docker wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O/etc/yum.repos.d/docker-ce.repo##…

STM32 USB虚拟串口

电路原理图 usb部分 晶振部分 usb与单片机连接 配置信息 sys配置信息 rcc配置信息 usb配置信息 虚拟串口配置信息 时钟配置信息 项目配置信息 代码 包含文件 主函数代码 实验效果 修改接收波特率依然可以正常接收&#xff0c;也就是说单片机可以自动适应上位机的波特率设置。…

4.17作业

#include "double_link_list.h" node_p create_double_link_list() //创建双向链表 {node_p H(node_p)malloc(sizeof(node));if(HNULL){printf("空间申请失败\n");return NULL;}H->data0;H->priNULL;H->nextNULL;return H; } node_p create_node…

【S32K3 MCAL配置】-6.1-ICU Driver:WKPU外设让MCU芯片从“Low Power Mode低功耗模式”中WakeUp唤醒

"><--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景:此博文适用于“MCU芯片处在常电”工作(MCU的5V/3.3V供电一直存在)的项目当中。另外S32K3仅有RUN模式和STANDBY模式,MCU进入“Low Power Mode低功耗模式”(STANDBY模式)后,可通过WKPU Pin唤醒MCU芯片…

MapReduce分区机制(Hadoop)

在MapReduce中&#xff0c;分区&#xff08;Partitioning&#xff09;是将Map阶段输出的键值对根据某种规则分发到不同的Reduce任务上的过程。这个过程非常关键&#xff0c;因为它直接影响到了Reduce阶段的负载均衡和性能。 1. 哈希分区&#xff08;Hash Partitioning&#xf…

封装react-antd-table组件参数以及方法如rowSelection、pageNum、pageSize、分页方法等等

一般情况下&#xff0c;我们在页面组件里面都会使用state创建对应的分页参数和分页方法然后传入对应的组件内部&#xff0c;再或者选择行、全选等等&#xff0c;这都会在每一个组件中徒增大量的代码行数&#xff0c;所以简单整理了一下这个只是针对于处理逻辑的组件&#xff1a…

BUUCTF——[GXYCTF2019]BabyUpload

BUUCTF——[GXYCTF2019]BabyUpload 1.上传嘛&#xff0c;直接丢正常的jpg文件进服务器 2.发现可以正常上传&#xff0c;并且回显出来啦文件上传的路径 /var/www/html/upload/7df22610744ec51e9cb7a8a8eb674374/1111.jpg 3.尝试上传一句话木马 <?php eval($POST[123456]…

HDFS详解(Hadoop)

Hadoop 分布式文件系统&#xff08;Hadoop Distributed File System&#xff0c;HDFS&#xff09;是 Apache Hadoop 生态系统的核心组件之一&#xff0c;它是设计用于存储大规模数据集并运行在廉价硬件上的分布式文件系统。 1. 分布式存储&#xff1a; HDFS 将文件分割成若干块…

Python机器学习项目开发实战:深度神经网络

注意&#xff1a;本文提供下载的教程&#xff0c;与以下文章的思路有相同点&#xff0c;也有不同点&#xff0c;最终目标只是让读者从多维度去熟练掌握本知识点。 在Python中开发一个基于深度神经网络的机器学习项目&#xff0c;可以涉及到许多不同的步骤和技术。以下是一个简化…

「 网络安全常用术语解读 」漏洞利用交换VEX详解

漏洞利用交换&#xff08;Vulnerability Exploitability eXchange&#xff0c;简称VEX&#xff09;是一个信息安全领域的标准&#xff0c;旨在提供关于软件漏洞及其潜在利用的实时信息。根据美国政府发布的用例(PDF)&#xff0c;由美国政府开发的漏洞利用交换(VEX)使供应商和用…

[ LeetCode ] 题刷刷(Python)-第26题:删除有序数组中的重复项

题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &…

工业电脑在ESOP工作站行业应用

ESOP工作站行业应用 项目背景 E-SOP是实现作业指导书电子化&#xff0c;并统一管理和集中控制的一套管理信息平台。信迈科技的ESOP终端是一款体积小巧功能齐全的高性价比工业电脑&#xff0c;上层通过网络与MES系统连接&#xff0c;下层连接显示器展示作业指导书。ESOP控制终…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持UDP 、TCP 、WebSocket 三种协议&#xff0c;支持iOS、Android、H5、小程序、Uniapp、标准Java平台&#xff0c;服务端基于Netty编写。 工…

MAC 终端命令

Command Shift . 显示隐藏文件夹 环境变量路径 ~/.zshrc ~/.bash_profile 每次打开都需要 source 安装Homebrew xcode安装 xcode-select --install brew安装 /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)” 检查是否…

朗思-我的家园正式上线:朗思科技Agent工具软件--人人拥有“Ai-机器人”

4月16日&#xff0c;朗思科技正式发布"朗思-我的家园"。朗思科技是国内领先的Ai Agent智能自动化工具软件产品及方案的提供商&#xff0c;始终坚持自主研发&#xff0c;全面支持国产信创&#xff0c;不断加快产品创新迭代。基于技术领先性和战略前瞻性&#xff0c;其…