设计模式——享元模式

设计模式 -- 享元模式(Flyweight Pattern) 使用共享对象可以有效的支持大量的细粒度对象。 应用场景 主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。例如:缓存,对象池;Android中: Message.obtain通过重用Message对象来避免大量的Message对象被频繁的创建和销毁。 FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeigh 阅读详情

FLYWEIGHT享元模式

1、 意图

运用共享技术有效地支持大量细粒度的对象。

2、 适用性

在下面情况下可以使用FLYWEIGHT模式

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量的对象,造成很大的存储开销。
  • 对象的大多数状态都可变为外部状态。
  • 如果删除了对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖与对象标识。由于Flyweight对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

3、 结构


4、 参与者

Flyweight

——描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。

ConcreteFlyweight

——实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。

UnsharedConcreteFlyweight

——并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。

FlyweightFactory

——创建并管理flyweight对象。

——确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已经创建的实例或者创建一个。

Client

——维持一个对Flyweight的引用。

——计算或存储一个(多个)flyweight的外部状态。

5、 协作

1)  Flyweight执行时所需的状态必定是内部或外部的。内部状态存储于ConcreteFlyweight对象之中;而外部对象则由Client对象存储或计算。当用户调用Flyweight对象的操作时,将该状态传递给它。

2)  用户不应直接对ConcreteFlyweight类进行实例化,而只能从FlyweightFactory对象得到ConcreteFlyweight对象,这可以保证他们适当地进行共享。

6、 效果

使用Flyweight模式时,传输、查找和/或计算外部状态都会产生运行时的开销,尤其当flyweight原先被存储为内部状态时。然而,空间上的节省抵消了这些开销。共享的Flyweight越多,空间节省越大。节约空间由以下几个元素决定:

  •  因为共享,实例总数减少的数目
  • 对象内部状态的平均数目
  • 外部状态是计算的还是存储的

共享的Flyweight越多,存储节约也就越多。节约量随着共享状态的增多而增大。当对象使用大量的内部及外部状态,并且外部状态是计算出来的而非存储的时候,节约量将达到最大。所以,可以使用两种方法来节约存储:用共享减少内部状态的消耗,用计算时间换取对外步状态的存储。

7、 实现

在实现Flyweight模式时应该注意以下:

1)删除外部状态;该状态的可用性在很大程度上取决于是否容易识别外部状态并将它从共享对象中删除。如果不同种类的外部状态和共享前对象的数目是相同的话,删除外部状态不会降低存储消耗。理想的状况是,外部状态可以由一个单独的对象结构计算得到,且该结构的存储要求非常小。

2)管理共享对象;因为对象是共享的,用户不能直接对它进行实例化,因此FlyweightFactory可以帮助用户查找某个特定的Flyweight对象。FlyweightFactory对象经常使用关联存储帮助用户查找感兴趣的Flyweight。

8、 代码示例

Flyweight:

package com.examples.pattern.flyweight;

/**
 * 享元接口,通过这个接口享元可以接受并作用于外部状态
 */
public interface Flyweight {

	public void operation(String extrinsicState);

}

ConcreteFlyweight:

package com.examples.pattern.flyweight;

/**
 * 享元对象
 */
public class ConcreteFlyweight implements Flyweight {

	private String intrinsicState;

	/**
	 * 构造方法,传入享元对象的内部状态的数据
	 * 
	 * @param intrinsicState
	 */
	public ConcreteFlyweight(String intrinsicState) {
		this.intrinsicState = intrinsicState;
	}

	@Override
	public void operation(String extrinsicState) {
		// 具体的功能处理,可能会用到享元内部、外部状态
		System.out.println("ConcreteFlyweight: " + extrinsicState);

	}

}

UnsharedConcreteFlyweight:

package com.examples.pattern.flyweight;

/**
 * 不需要共享的Flyweight对象; 通常是将被共享的享元对象作为子节点组合出来的对象。
 */
public class UnsharedConcreteFlyweight implements Flyweight {

	private String allState;

	@Override
	public void operation(String extrinsicState) {
		System.out.println("UnsharedConcreteFlyweight: " + extrinsicState);
	}
}
FlyweightFactory:

package com.examples.pattern.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * 享元工厂
 */
public class FlyweightFactory {

	/**
	 * 缓存多个Flyweight对象
	 */
	private Map<String, Flyweight> fsMap = new HashMap<String, Flyweight>();

	public Flyweight getFlyweight(String key) {
		// 1: 先从缓存中查找,是否存在key对应的Flyweight对象
		Flyweight f = fsMap.get(key);

		// 2: 如果存在,就返回相对的Flyweight对象
		if (f == null) {
			// 3: 如果不存在
			// 3.1 创建一个新的Flyweight对象
			f = new ConcreteFlyweight(key);
			// 3.2把这个新的Flyweight对象添加到缓存中
			fsMap.put(key, f);

		}
		// 3.3然后返回这个新的Flyweight对象
		return f;
	}

	public int getSize() {
		return fsMap.size();
	}

}

Client:

package com.examples.pattern.flyweight;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		FlyweightFactory ff = new FlyweightFactory();
		Flyweight fw_1 = ff.getFlyweight("fw_1");
		fw_1.operation("fw_1");
		Flyweight fw_2 = ff.getFlyweight("fw_2");
		fw_2.operation("fw_2");
		Flyweight fw_3 = ff.getFlyweight("fw_2");
		fw_3.operation("fw_2");

		System.out.println(ff.getSize());

	}

}

9、 相关模式

Flyweight模式通常和Composite模式结合起来,用共享叶节点的有向无环图实现一个逻辑上的层次结构。

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

相关推荐

Java设计模式之享元模式

设计模式之享元模式 设计模式之享元模式 设计模式之享元模式

JAVA设计模式之享元模式详解

享元模式 (flyweight pattern) 的原始定义是:摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,从而让我们能在有限的内存容量中载入更多对象。从这个定义中你可以发现,享元模式要解决的核心问题就是节约内存空间,使用的办法是找出相似对象之间的共有特征,然后复用这些特征。所谓“享元”,顾名思义就是被共享的单元。比如: 一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用较多的内存空间,我们可以使用享元模式解决这一类问题.

励志成为一名优秀的全能型软件开发工程师。 2246

Simplorer-Maxwell联合仿真速度太慢?我用这3个技巧把仿真时间砍半(附SVPWM周期与步长设置避坑)

本文详细介绍了Simplorer-Maxwell联合仿真性能优化的3个关键技巧,包括仿真步长与周期的科学配置、基于任务调度的加速技术以及模型简化与精度平衡。特别针对SVPWM参数设置提供了避坑指南,帮助工程师在不牺牲精度的情况下将仿真时间缩短50%以上,适用于电机驱动系统开发等场景。

weixin_29189381的博客 466

java设计模式-享元模式

java设计模式-享元模式

有一种信仰叫海阔天空 896

数据湖是什么?有什么优势?与数仓区别?未来的发展?

数据湖是什么?有什么优势?与数仓区别?未来的发展?一、什么是数据湖二、数据湖的发展三、数据湖有哪些优势四、数据湖应该具备哪些能力五、数据湖的实现遇到了哪些问题六、数据湖与数据仓库的区别七、为什么要做数据湖?区别在于?八、数据湖挑战九、湖仓一体十、目前有哪些开源数据湖组件 来源:大数据DT 一、什么是数据湖 数据湖是一种不断演进中、可扩展的大数据存储、处理、分析的基础设施;以数据为导向,实现任意来源、任意速度、任意规模、任意类型数据的全量获取、全量存储、多模式处理与全生命周期管理;并通过与各类外部异构数据

一个写湿的程序猿 9149

海思SD3403/SS928开发(二)环境搭建:从零到一构建高效开发环境的实战指南

本文详细介绍了海思SD3403/SS928开发板环境搭建的全流程,包括Ubuntu系统选择、基础配置、开发环境依赖安装、SDK工具链配置等关键步骤。通过实战经验分享,帮助开发者避免常见问题,快速构建高效开发环境,提升开发效率。

weixin_28717683的博客 284

【Java教程】Day20-11 设计模式:结构型模式——享元模式(Flyweight)

享元模式(Flyweight Pattern)是一种结构型设计模式,它的核心思想是通过共享对象来减少内存占用,特别适用于需要大量相似对象的场景。享元模式的基本原理是:如果一个对象实例的状态不可变,则多次创建相同实例没有必要,可以直接返回共享的对象实例。这样不仅能够节省内存,还能提高系统的性能,避免频繁地创建和销毁对象。

max202011161630的博客 1149

基于FLUENT的圆柱绕流数值模拟与流场优化策略

本文详细介绍了基于FLUENT的圆柱绕流数值模拟方法与流场优化策略。从基础概念、建模技巧到湍流模型选择,全面解析了圆柱绕流模拟的关键技术,并提供了实用的网格划分和参数设置建议。通过具体案例展示了流动控制方法和优化流程,帮助工程师有效降低阻力系数,提升流场性能。

f6g7h8i9j的博客 705

【Java设计模式】十二、享元模式

减少内存中相似对象的数量,节约空间将对象分离为内部状态和外部状态,逻辑变复杂了系统中有大量的相似对象。

llg___的博客 652

YOLOv12涨点改进 | 全网首发,Conv改进篇 | CVPR 2025 | YOLOv12引入FDConv频率动态卷积,含A2C2f_FDConv二次创新模块,能够捕捉更加丰富和复杂的特征信息

本文提出了一种改进YOLOv12目标检测模型的方法——频率动态卷积(FDConv)。FDConv通过增强卷积核的频率响应多样性,使模型能够更好地处理不同频率信息,从而提高检测精度。该方法包含三个关键组件:傅里叶离散权重(FDW)实现频率分组,核空间调制(KSM)动态调整频率响应,以及频率带调制(FBM)进行频域调节。实验结果表明,FDConv能以较少的参数增长(仅增加3.6M)显著提升模型性能,在目标检测、实例分割等任务中优于传统动态卷积方法。该方法可灵活集成到ResNet、ConvNeXt等多种架构中。

Ai缝合怪、助力小伙伴高效发论文 421

AUTOSAR进阶图解==>AUTOSAR_EXP_CDDDesignAndIntegrationGuideline

本文档提供了AUTOSAR架构中复杂驱动(CDD)的设计与集成指南。CDD作为非标准化的软件实体,位于复杂驱动层,实现传感器评估、执行器控制、微控制器访问等特殊功能。文档详细阐述了CDD的架构特点、设计建议(包括文档要求、文件结构、接口描述等)以及与其他模块(RTE、库、标准BSW等)的集成方式。特别强调了CDD在多核系统和MCAL层中的实现考量,为开发人员提供了从文档规范到代码实现的全方位指导,确保CDD在保持AUTOSAR兼容性的同时满足特殊功能需求。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1886

Java设计模式之享元模式:从入门到架构级实践

享元模式(Flyweight Pattern)通过共享技术优化大量细粒度对象的内存占用,其核心在于区分对象的内部状态(Intrinsic State)与外部状态(Extrinsic State)。诊断阶段:使用JProfiler分析内存热点设计阶段:确定状态分离策略实现阶段:构建享元工厂+监控体系优化阶段:引入缓存淘汰和预热机制扩展阶段:实现分布式对象池。

java2cy 1071

KUKA机器人修改机器人名称和IP地址的具体方法示例

KUKA机器人修改机器人名称和IP地址的具体方法示例

Robot_PLC_HMI_Automation 5258

23种设计模式之享元模式(Flyweight Pattern)

本篇文章将23种设计模式中的享元模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

YOLOv12改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

《YOLOv12高效涨点改进专栏》提供500+创新改进方案,涵盖卷积、主干网络、注意力机制等模块优化,适用于检测、分割等任务。改进点来自顶会论文和个人经验,支持多种模型版本和任务场景。专栏包含详细教程、数据集增强、性能评估工具等,帮助科研人员快速实现模型优化和论文发表。提供完整运行项目和环境配置指导,适合计算机及相关专业研究人员使用,持续更新保障长期科研需求。

Ai缝合怪、助力小伙伴高效发论文 2300

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

23种设计模式——享元模式(Flyweight Pattern)

本文介绍了23种经典设计模式之——享元模式(Flyweight Pattern)的使用及说明

Meteors.的博客 1345

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

享元模式是八种结构型模式之一,享元就是共享单元(元素)的意思,可以理解是共享对象。享元模式的用途就是复用对象,节省内存。 如何使用享元模式,用棋牌室举例。 斗地主相信很多人都玩过,一副版,黑红花方四色,每一色都有从2到A的13张牌,加上大小王,共有54张牌。假如一张牌就是一个对象,一张桌子就要54个对象;一个牌室300张桌子;一个服务器有50个牌室;这样的服务器可能又有200个。那这样的对象就是54*300*50*200=162000000个。 ...

xjj1314的专栏 350

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

设计模式-享元模式(Flyweight Pattern)

享元模式 定义 Use sharing to support large numbers of fine-grained objects efficiently. 使用共享对象可有效地支持大量的细粒度的对象。 类型 结构型。 适用场景 在对象(相同或相似的对象)足够多的时候,而创建这些对象造成了很大的系统开销时,应该考虑使用享元模式。 享元有被频繁使用的场景,才有使用享元模式的价值,因为,在...

kaven 4493

设计模式:享元模式(Flyweight Pattern)

享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。

TechNomad的博客 852

秒懂设计模式之享元模式(Flyweight Pattern)

[版权申明] 非商业目的注明出处可自由转载 博文地址: 出自:shusheng007 设计模式汇总篇,一定要收藏: 永不磨灭的设计模式(有这一篇真够了,拒绝标题党) 文章目录概述类型难度定义使用场景UML类图实例第一步,定义一个共享对象通用的接口第二步,实现需要共享的对象类第三步,共享对象工厂第四步,客户端使用技术要点总结优缺点优点缺点总结 概述 也许你会觉得享元模式比较陌生,但是相信在你的软件开发生涯中应该不知不觉的用了很多次,只是你没有总结。例例如你肯定用到过缓存,用到过对象池… 不知道作为IT猿的.

ShuSheng007的程序人生 2340

彻底搞懂设计模式DesignPattern-享元模式

对原理图的说明-即(模式的角色及职责) FlyWeight是抽象的享元角色,他是产品的抽象类,同时定义出对象的外部状态和内部状态的接囗或实现 2)ConcreteFlyWeight是具体的享元角色,是具体的产品类,实现抽象角色定义相关业务 UnSharedconcreteFlyWeight是不可共享的角色,一般不会出现在享元工厂 FlyWeight Factory享元工厂类,用于构建一个池客器(集合),同时提供从池中获取对象方法 ...

Ping 291

设计模式-10享元模式Flyweight Pattern

摘要:享元模式是一种结构型设计模式,通过共享相似对象来减少内存消耗和提高性能。它适用于系统中有大量相似对象且大多数状态可外部化的场景。模式包含享元接口、具体享元类、享元工厂和客户端四个主要部分。文中提供了两种实现示例:文本编辑器中的字符共享和图形渲染中的树对象共享,展示了如何通过工厂管理共享对象,显著减少实际创建的对象数量。

d3y1`5 81_09 960

设计模式之享元模式详解(FlyWeight Pattern)

基本介绍 享元模式(Flyweight Pattern) 也叫 蝇量模式: 运用共享技术有效地支持大量细粒度的对象 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池...

Superman_peng的博客 641

【设计模式】享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)又被称作轻量级模式、蝇量模式,它经典的体现就是对象池。享元模式的根本目的就是"共享单元",让对象能够共享复用,就像共享单车一样,路人甲(客户程序A)骑完路人丙(客户程序B)用,以此减少内存占用。

櫆溟的博客 487

DesignPattern-享元模式

享元模式:String常量池,数据库连接池,缓冲池等等都是享元模式的应用。 每次创建字符创对象时候,都需要创建一个新的字符串对象的话,内存开销很大,所以如果第一次创建了字符串对象hunter,下次在创建相同的字符串hunter时,只是把它的引用再次指向hunter,这样就实现了hunter字符串内内存中的共享。 角色: Flyweight:抽象享元类,所有具体享元类的超类or接口, Concret...

其实我也没有太多期盼,毕竟一生太短,少有圆满 163

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

享元模式(Flyweight Pattern)是一种结构型设计模式,它的目的是通过共享技术来有效地支持大量细粒度的对象。享元模式可以极大地减少内存的使用,从而提高程序的性能。它特别适用于需要创建大量相似对象的场景,通过共享不变的部分来减少对象的数量和内存消耗。具体享元模式实现FlyweightInterface接口, 查看内外部状态。通过 Map 存储之前对象,获取之前的对象无需重新创建。定义 flyweight 的接口。

ling_zhi_xin的博客 1050
上一篇: 设计模式——备忘录模式
下一篇: 设计模式——解释器
HingKwan
博客等级 码龄17年 51粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值