Java设计模式之享元模式

【Java设计模式】Java设计模式之(二十三)享元模式(Flyweight Pattern) 本文目录 一、组合模式介绍 1.1 含义 1.2 适用场景 1.3 主要解决 1.4 应用实例 1.5 优缺点 二、组合模式实现 2.1 类图 2.2 角色分析 2.3 代码实现 三、源码分析 这种类型的设计模式属于结构型模式。 一、组合模式介绍 1.1 含义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对 阅读详情

前言

当系统中存在大量相同或者相似的对象时,享元模式是一种值得考虑的解决方案,它通过 共享技术实现相同或相似的细粒度对象的复用,从而节约了内存空间、提高了系统性能。在享元模式中提供了一个享元池用于存储已经创建好的香园对象,并通过享元工厂类将享元对象提供给客户端使用。

正文

一、享元池

享元模式通过共享技术实现相同或相似对象的重用,在逻辑上每一个出现的字符都有一个对象与之对应,然而在物理上它们却共享同一个享元对象,这个对象可以出现在一个字符串的不同地方,相同的字符对象都指向同一个实例,在享元模式中存储这些共享实例对象的地方称为享元池(Flyweight Pool)。

二、享元的内部状态和外部状态

享元模式以共享的方式高效地支持大量细粒度对象的重用,享元对象能做到共享的关键是区分了内部状态(Intrinsic State)和外部状态(Extrinsic State)。
(1)内部状态是存储在享元对象内部并且不会随环境改变而改变的状态,内部状态可以共享。例如字符的内容不会随外部环境的变化而变化,字符“a"始终是”a",不会变成“b"。
(2)外部状态是随环境改变而改变的、不可以共享的状态。享元对象的外部状态通常由客户端保存,并在享元对象被创建之后需要使用的时候再传入到享元对象内部。一个外部状态与另一个外部状态之间是相互独立的。例如有的”a"是红色的,有的是绿色的,有的“a"是五号字,有的是四号字。
正因为区分了内部状态和外部状态,可以将具有相同内部状态的对象存储在享元池中,享元池中的对象是可以实现共享的,当需要的时候就将对象从享元池中取出,实现对象的复用。通过向取出的对象注入不同的外部状态可以得到一系列相似的对象,而这些对象在内存中实际上只存储一份。

三、定义

定义如下:

享元模式: 运用共享技术有效地支持大量细粒度对象的复用。
Flyweight Pattern: Use sharing to support large numbers of fine-grained objects efficiently.

享元模式要求能够被共享的对象必须是细粒度对象,它又称为轻量级模式,享元模式是一种对象结构型模式。

四、结构

享元模式的结构较为复杂,通常结合工厂模式一起使用,包含了一个享元工厂类:
(1)Flyweight(抽象享元类):抽象享元类通常是一个接口或抽象类,抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态)。同时也可以通过这些方法来设置外部数据(外部状态)。
(2)ConcreteFlyweight(具体享元类):具体享元类实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。通常可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。
(3)UnsharedConcreteFlyweight(非共享具体享元类):并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可以设计为非共享具体享元类;当需要一个非共享具体享元类的对象时可以直接通过实例化创建。
(4)FlyweightFactory(享元工厂类):享元工厂类用于创建并管理享元对象,它针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合(也可以是其他类型的集合),可以结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已创建的实例或者创建一个新的实例(如果不存在),返回新创建的实例并将其存储在享元池中。

五、实现

典型的抽象享元类代码如下:

public abstract class  Flyweight{
	public abstract void operation(String extrinsicState);
}

在具体享元类中通常将内部状态作为具体享元类的成员变量,而外部状态通过注入的方式添加的具体享元类中。典型代码如下:

public class ConcreteFlyweight extends Flyweight{
	//内部状态intrinsicState作为成员变量,同一个享元对象的内部状态是一致的
	private String intrinsicState;
	public ConcreteFlyweight(String intrinsicState){
		this.intrinsicState = intrinsicState;
	}

	//外部状态extrinsicState在使用时由外部设置,不保存在享元对象中,即使是同一个对象
	//在每一次调用时可以传入不同的外部状态
	public void operation(String extrinsicState){
		//实现业务方法
	}
}

在使用享元模式时,有时候还需要处理那些不需要共享的抽象享元类的子类,典型代码如下:

public class UnsharedConcreteFlyweight extends Flyweight{
	public void operation(String extrinsicState){
		//实现业务方法
	}
}

享元工厂类的代码如下:

public class FlyweightFactory{
	//定义一个HashMap用于存储享元对象,实现享元池
	private HashMap flyweights = new HashMap();

	public Flyweight getFlyweight(String key){
		//如果对象存在,则直接从享元池获取
		if(flyweight.containsKey(key)){
			return (Flyweight)flyweight.get(key);
		}
		//如果对象不存在,先创建一个新的对象添加到享元池中,然后返回
		else{
			Flyweight fw = new ConcreteFlyweight();
			flyweights.put(key,fw);
			return fw;
		}
	}
}

六、单纯享元模式与复合享元模式

1、单纯享元模式

在单纯享元模式中所有的具体享元类都是可以共享的,不存在非共享具体享元类。

2、复合享元模式

将一些单纯享元对象使用组合模式加以组合可以形成复合享元对象,这样的复合享元对象本身不能共享,但是它们可以分解成单纯享元对象,而后者可以共享。
通过使用复合享元模式可以让复合享元类CompositeConcreteFlyweight中包含的每个单纯享元类ConcreteFlyweight都具有相同的外部状态,而这些单纯享元的内部状态往往可以不同。

七、享元模式与String类

JDK类库中的String类使用了享元模式。
Java String类这种在修改享元对象时现将原有对象复制一份,然后再新对象上实施修改操作的机制称为“Copy On White"。

八、享元模式优缺点与适用环境

优点

(1)享元模式可以减少内存中对象的数量,使得相同或者相似对象在内存中只保存一份,从而可以节约系统资源,提供系统性能。
(2)享元模式的外部状态相对独立,而且不会影响其内部状态,从而使享元对象可以在不同的环境中被共享。

缺点

(1)享元模式使系统变得复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。
(2)为了使对象可以共享,享元模式需要将对象的部分状态外部化,而读取外部状态将使运行时间变长。

适用环境

(1)一个系统有大量相同或者相似的对象,造成内存的大量耗费
(2)对象的大部分状态都可以外部化,可以将这些外部状态传入对象中
(3)在使用享元模式时需要维护一个存储享元对象的享元池,而这需要耗费一定的系统资源,因此应当在需要多次重复使用享元对象时才使用享元模式。

以上文字,大量摘抄自《Java设计模式》一书,由刘伟老师编著,故本文应当列入转载一类,有兴趣的朋友可以直接阅读原书。

博途 V16(TIA portal V16)安装教程 本文提供了西门子TIA Portal V16软件的完整安装指南。内容包括百度网盘下载链接(提取码kv69)、详细安装步骤(关闭安全保护、典型安装设置)、授权破解方法,以及PLCSIM仿真功能的使用说明。重点演示了S7-1200 PLC程序的仿真过程,解析了仿真界面各元素功能,包括状态指示灯(RUN/STOP/ERROR)、操作按钮(RUN/STOP/MRES)和网络接口状态等。通过图文并茂的方式,完整呈现了从软件安装到PLC程序仿真的全流程操作。 阅读详情

相关推荐

避坑指南:ROS2 Humble摄像头标定常见错误排查(从‘CALIBRATE’按钮不变绿到保存文件找不到)

本文详细解析了ROS2 Humble环境下摄像头标定的常见问题及解决方案,从CALIBRATE按钮不变绿到标定文件保存失败等疑难杂症。提供硬件准备、参数设置、实时诊断到结果验证的全流程指导,特别针对Ubuntu2204系统和usb_cam驱动的兼容性问题给出实用建议,帮助开发者高效完成内参标定。

weixin_29193359的博客 398

Java七种常用设计模式

抽象工厂模式(Abstract Factory Pattern)是Java中常用的一种创建型设计模式,它提供了一种创建一系列相关或相互依赖的对象接口,而无需指定它们具体的类。抽象工厂模式和工厂方法模式类似,不同之处在于抽象工厂模式中工厂类不单独生产一种产品,而是生产一系列相关的产品。定义抽象产品类:void use();定义具体产品类:System . out . println("使用ProductA1");System . out . println("使用ProductA2");

qq_45196093的博客 2万+

【科研】Michaelis–Menten 曲线(米氏曲线)中反应速率的计算

Michaelis–Menten 曲线 米氏曲线 纵坐标 反应速率求值 朗伯比尔定律

weixin_42809675的博客 2万+

一文讲完Java常用设计模式(全23种)

设计模式是软件开发中非常有用的工具,可以提高代码的可重用性和可维护性,同时也可以提高开发人员的工作效率。 设计模式有几种类型,包括创建型、结构型和行为型模式。 创建型模式用于以灵活和高效的方式创建对象。包括Singleton模式、工厂模式和抽象工厂模式等。 结构型模式用于组合类和对象以形成更大的结构。包括适配器模式、桥接模式和装饰器模式等。 行为型模式用于处理类或对象之间的通信和控制流。包括观察者模式、策略模式和模板方法模式。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 4万+

配置oem 13c以监控管理数据库

使用oem13c监控数据库

雅冰石的专栏 1810

Cube生成定时器2触发双ADC同步采集并用DMA传输

前言 用cube生成一个用定时器触发ADC1,ADC2同步采集的程序,单片机选择的是STM32L476RGT6,用定时器2进行ADC采集触发,更改定时器2的定时周期便可以更改ADC的采样周期,ADC1和ADC2使用同步规则模式,并用DMA进行数据的传输。 STM32的ADC采样完成总共需要的时间是 ADC完成采样时间=采样周期+12个转换周期 举个例子,假如ADC的时钟是15MHz,采样周期是3个周期,3个采样周期加上12个转换周期,一共是15个周期,因为时钟是15MHz,所以完成一次ADC转换总共需要的时

一行代码的博客 4513

Java 中的 23 种设计模式详解

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

微笑听雨 7万+

Revit二次开发之双事件:空闲事件与DocumentChanged事件

对以下文章所展示的代码进行了修改,当前展示的代码可直接复制使用。 由于本人初学,下列语言为个人理解,如有错误请指正。   《引用1》中: 使用模态对话框,或者尽量保证事件在ExternalCommand的Execute函数或者ExternalApplication的OnStartup函数里面注册。 如果一定要使用非模态对话框,那么请使用ExternalEvent事件的Raise函数,强迫...

一个Revit二次开发的实习生 6147

设计模式第14讲——享元模式(Flyweight)

享元模式是一种结构型的设计模式。一、什么是享元模式 二、 角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构5.1 Bike——抽象享元类(FlyWeight)5.2 具体享元类(ConcreteFlyWeight)5.3 BikeFactory——享元工厂(FlyWeightFactory)5.4 testFlyWeight 六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

液冷方式介绍

如果将直径在1~100nm的颗粒悬置在传热流体(例如:水、乙烯、乙二醇等)中时,其传热能力会得到提升,因为大多数固体材料的热导率要大于液体,因此由颗粒、流体组成的混合物热导率也高于液体本身的热导率,由此制成的流体,我们称之为纳米流体。金属冷管的液体工质蒸散量几乎为0,而柔软材质的管道则会产生液体的蒸散,在封闭式循环系统中,为了弥补液体工质的蒸散,必须定期在系统中补充液体工质。——我们之前说过,材料的导电和导热的机制大致是类似的,所以导电能力更强的金属往往具有更好的导热能力。

制冷技术咨询与服务的博客 2036

DIY玩家必备:用SSS1623芯片打造高性价比USB麦克风(附完整电路图)

本文详细介绍了如何利用SSS1623芯片DIY高性价比USB麦克风,包括元件选型、电路设计、PCB布局及调试技巧。通过完整的电路参考设计和实用建议,帮助电子爱好者打造专业级录音设备,实现免驱动即插即用功能。

weixin_29166013的博客 239

java中常用的5种设计模式

【代码】java业务开发中常用的5种设计模式。

qq_41659974的博客 5789

解决k8s核心组件calico pod资源不创建问题

解决k8s核心组件calico pod资源不创建问题 1.问题描述 由于K8S集群Master节点故障,导致calico网络组件虽然处于Running状态,但是一直无法准备就绪,如下图所示 calico-node-lpt7h运行在master节点,第一时间紧急处理方法就是将其pod删除,让K8S自动重建该pod,使整个集群快速恢复 但是就当我将calico-node-lpt7h pod删除后,该pod始终无法自建,就好像是从来没有这个pod似的 2.解决方法 期初排查时,我觉得可能是由于当前master

江晓龙的博客 4807

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

享元模式 业务需求 小型外包项目,产品网站,不同客户要求不同 有些客户要求以新闻形式发布;有些客户要求以博客形式发布;有些客户要求以微信公众号形式发布; 传统解决思路 复制粘贴,根据不同用户的需求,各自修改 每个网站各租用一个空间 传统解决思路问题分析 交付的网站结构相似度很高,且访问量都不高;分别使用不同的虚拟空间,比较浪费服务器资源 解决思路:整合到一个网站,共享其中相关代码和数据,减少服务器资源浪费 对于代码来说,每个项目就是一个实例,维护和扩展更容易—享元模式 基本介绍 享元模式也叫蝇

super_song的博客 390

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

旨在通过共享对象来有效支持大量细粒度对象的复用,从而减少内存占用和提高性能。假设需要绘制大量树(Tree)对象,树的类型(名称、颜色)可共享,位置和年龄为外部状态。类的常量池是享元模式的典型实现,相同字面量的字符串对象被复用。,适用于存在大量重复对象且对象的大部分状态可以外部化的场景。:通过共享内部状态减少对象数量,外部状态由客户端传递。:存在大量相似对象且内存占用是瓶颈时优先考虑。:享元工厂管理共享对象池,确保唯一性。:字符的字体、颜色、大小。:字符在文档中的位置。:子弹的位置、速度。

guanxin0206的博客 730

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java设计模式(十二)享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)的介绍、应用场景、优缺点以及代码实现。并有示例的讲解。

weixin_70044963的博客 1283

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java设计模式 十二 享元模式 (Flyweight Pattern)

享元接口定义了对象的共享方法。

空 1221

Java设计模式——享元模式【Flyweight Pattern】

Java设计模式、享元模式、Flyweight Pattern

scorpio的博客 822

【设计模式】用Java实现享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式旨在通过共享对象来最小化内存使用和提高性能。享元模式通过将对象的状态分为内部状态(Intrinsic State)和外部状态(Extrinsic State),并共享内部状态,从而在大量相似对象之间实现有效的资源共享。内部状态是对象可共享的、独立于对象场景的状态,它可以被多个对象共享。外部状态是对象特定的、依赖于对象场景的状态,它不能被共享,每个对象都会保持一份独立的外部状态。

分享Java硬核干货 9749

设计模式 · 享元模式(Flyweight Pattern)java

享元模式是一种结构型设计模式,通过共享相似对象的内在状态来减少内存消耗。其核心思想是将对象分为可共享的内在状态(如树的纹理、颜色)和不可共享的外部状态(如坐标)。该模式包含享元工厂、抽象享元接口和具体享元类三个核心角色,工厂负责管理对象池并复用已有对象。典型应用场景如游戏开发中渲染大量相似树木,通过共享树种和纹理数据,仅存储每棵树的坐标差异,显著降低内存占用。该模式能有效解决海量重复对象导致的内存浪费问题。

qq_61875563的博客 699

JAVA设计模式之享元模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述享元(Flyweight)模式的:   Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意。享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。 Java中的String类型   在JAVA语言中,String类型就是使用了享元模式。S...

weixin_30663391的博客 89

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

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

慕白Lee的博客 640

Java设计模式--享元模式【Flyweight Pattern】

享元模式是对象的结构模式。享元模式的意图是通过共享高效地支持大量细粒度的对象,是让多个客户对象间共享访问限定数量的对象,享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。     内蕴状态(Internal State)是存储在享元对象内部的,并且是不会随环境的改变而有所不同。因此,一个享元可以具有内蕴状态并可以共享。

CoderLover 381

Java设计模式 —— 【结构型模式】享元模式(Flyweight Pattern) 详解

享元模式也叫蝇量模式,是运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

知唔猪的博客 1644

Java设计模式-享元模式

享元模式是Java设计模式中一种被广泛应用的优化性能的设计模式。通过共享内部状态来减少对象的数量,从而降低内存消耗和提升系统性能。与单例模式和原型模式相比,享元模式注重对象的重用而不是单例或复制。使用Java编程语言实现享元模式可以通过共享池来管理对象的共享和创建。该模式的优点在于减少对象数量、提升性能和简化对象结构。通过共享对象,系统内存占用减少,同时避免了重复创建对象的开销,从而提高了系统的性能。通过划分内部状态和外部状态,对象结构更清晰,更易于理解和维护。然而,享元模式也存在一些缺点和限制。

小薯条的博客 507
上一篇: Java设计模式之外观模式
下一篇: Java设计模式之代理模式
js_tengzi
博客等级 码龄11年 24粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值