java 23种常用设计模式之享元模式(FlyWeight)

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

在说明享元模式的定义之前我们先来看个图,意会一下。

我相信与很多人一眼就能看懂,享元模式的优点也一目了然。

享元模式的官方定义是运用共享技术有效的支持大量细粒度的对象。其实就是使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。

就像上面图中,颜色和字体共享显示(但做事一种归类划分也没问题,让同类事物共享资源)。

它主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。类图借用一下啦!


FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。

在javaSE中有很多经典的应用,说到这个模式,不得不提一下数据库的JDBC连接池,对数据库连接池来说,url、driverClassName、username、password及dbname,这些属性对于每个连接来说都是一样的,所以适合用享元模式来处理,建一个工厂类ConnectionPool ,将上述类似属性作为内部数据,其它的作为外部数据,在方法调用时,当做参数传进来,通过连接池的管理,实现了数据库连接的共享,不需要每一次都重新创建连接,节省了数据库重新创建的开销,提升了系统的性能!看代码:

package com.freedom.flyweight;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;

public class ConnectionPool {
	
	private Vector<Connection> pool;
	
	/*共享属性*/
	private String url = "jdbc:mysql://localhost:3306/test";
	private String username = "root";
	private String password = "root";
	private String driverClassName = "com.mysql.jdbc.Driver";

	private int poolSize = 100;
//	private static ConnectionPool instance = null;
	Connection conn = null;

	/*构造方法,做一些初始化工作*/
	private ConnectionPool() {
		pool = new Vector<Connection>(poolSize);

		for (int i = 0; i < poolSize; i++) {
			try {
				Class.forName(driverClassName);
				conn = DriverManager.getConnection(url, username, password);
				pool.add(conn);
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	/* 返回连接到连接池 */
	public synchronized void release() {
		pool.add(conn);
	}

	/* 返回连接池中的一个数据库连接 */
	public synchronized Connection getConnection() {
		if (pool.size() > 0) {
			Connection conn = pool.get(0);
			pool.remove(conn);
			return conn;
		} else {
			return null;
		}
	}
}
小结:享元模式适用于作共享的一些个对象,他们有一些共有的属性。

问题来了,上面的代码是不是有点像大力模式呢?它们有什么区别呢?
享元模式可以理解成一组共享的对象集合,下面就是一个简单的享元设计模式,甚至可以说是工厂模式了,呵呵,工厂模式目的是将具体创建对象的过程由工厂方法提供,用户只需要知道抽象类型即可。但这个例子就不要纠结成工厂模式了)
package com.freedom.flyweight;

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

public class FlyWeight {
	private Map<String, Object> map = new HashMap<String, Object>();
	public Object get(String key) {
	    if(map.containsKey(key)) {
	        return map.get(key);
	    }
	    Object obj = new Object();
	    map.put(key, obj);
	    return obj;
	}
	
	public static void main(String[] args) {
		FlyWeight fw = new FlyWeight();
		fw.map.put("test", "freedom");
		System.out.println(fw.get("test"));
	}
}
单例模式
package com.freedom.flyweight;

public class Singleton {
	
	private static Singleton instance = null;
	private String name;
	
	private Singleton(String name){
		this.name = name;
	}
	
	public static Singleton getInstance(){
		if(instance == null){
			instance = new Singleton("freedom");
		}
		return instance;
	}
	
	public static void main(String[] args) {
		System.out.println(Singleton.getInstance().name);
	}
	
}
看完代码的话区别就不要运用多说了,享元设计模式是一个类有很多对象,而单例是一个类仅一个对象;享元模式是为了节约内存空间,提升程序性能(避免大量的new操作);而单例模式则主要是出于共享状态的目的。

最后再来总结一下享元模式的优缺点:

优点:在于它大幅度地降低内存中对象的数量。但是,它做到这一点所付出的代价也是很高的。

缺点:1.使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

            2.将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

Finish!

源码下载:http://download.youkuaiyun.com/detail/github_22022001/8331775


深入理解设计模式:享元模式(Flyweight Pattern) 在软件开发中,我们经常会遇到需要创建大量相似对象的情况。如果每个对象都独立存储所有数据,将会消耗大量内存资源,导致系统性能下降。享元模式(Flyweight Pattern)正是为解决这一问题而生的经典设计模式。本文将深入探讨享元模式的核心概念、实现原理、应用场景以及实际案例,帮助读者全面理解并掌握这一高效的对象共享技术。 阅读详情

相关推荐

23种设计模式-享元(Flyweight)设计模式

软考中级-软件设计师 享元设计模式

片言可决讼,半纸能缚龙 3223

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

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

小威的博客 2万+

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入探讨了SAP CO模块中KKA2和CJ88结果分析码在项目收入成本匹配中的高阶应用。通过真实案例解析,详细介绍了这两种分析码在分阶段收入确认和终验法项目中的配置技巧与实战经验,帮助财务人员高效解决复杂业务场景下的财务数据处理难题。

weixin_29230773的博客 168

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

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

Meteors.的博客 1345

CXL3.0 CDAT(Coherent Device Attributes Table)

在说明CDAT之前,先讲一下CXL中的DOE类型:CXL协议里定义了两种DOE的类型,一种是Compliance就是合规性测试的内容,还有一种就是CDAT(一致性属性表)Memory_Info_Valid是CXL设备的内存配置完成标志,位于DVSEC(Designated Vendor-Specific Extended Capability)的CXL Range X Size Low寄存器中(X为1或2)。

Summer的博客 1437

Signoff Criteria --- ocv/aocv/pocv之AOCV介绍

Advanced on chip variation,相比较于OCV来说,对于悲观度的去除很有效。相比较与ocv对于整个design中的lauch/capture path设置统一的derate值,aocv通过将cell derate值与cell的逻辑深度以及实际的位置结合起来进行derate值的设定。那么这种derate如何能够设置到具体的cell呢,其实是我们在跑STA时候会读入相关的aocv lib file,里面有专门对相关的cell进行的aocv derate值的描述。> table: \

sinat_27691203的博客 7854

java23设计模式---class10、享元模式(FlyWeight)

文章目录一、基本介绍1、定义2、优点3、缺点4、角色1)抽象享元类2)具体享元类3)享元工厂类4)组合享元类二、应用情景1、线程池2、String3、Integer4、五子棋三、与其他模式的搭配使用三、代码解析 一、基本介绍 1、定义 享元模式(FlyWeight),又称为蝇量模式,常用于有着大量重复使用的细粒度对象时。实质上是一种共享技术。 2、优点 1)利用享元池,可以使得用户在调用一个对象时可以不必去new,只需要在享元池中直接获取即可,节约了内存空间。 2) 3、缺点 1)逻辑会更加的复杂。 2)对

m0_51801058的博客 2820

【自动驾驶学习笔记——Prescan和Simulink 学习笔记和问题记录(1)】

主要记录一些Prescan/Simulink 联合仿真出现的问题。

ly1336545868的博客 1465

Flyweight模式_Java中23种设计模式

—————————— ASP.Net+Android+IOS开发、.Net培训、期待与您交流! —————————— 享元模式: Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况成立时使用Flyweight模式:1一个应用程序使用了大量的对象。2完全由于使用大量的对象,造成很大的存储开销。3对象的大多数状态都可以变为外部状态。4如果删除对象以外的状...

weixin_30869099的博客 96

Zabbix7.4监控系统在Rocky Linux10.0上的完整部署流程(含MariaDB配置)

本文详细介绍了在Rocky Linux 10.0操作系统上部署企业级监控系统Zabbix 7.4的完整流程,并重点阐述了与MariaDB数据库的深度集成与性能优化配置。内容涵盖从系统环境准备、数据库安装与安全加固、Zabbix核心组件部署,到服务配置、Web界面初始化以及生产环境高级调优的全方位实战指南,旨在帮助用户构建稳定高效的监控平台。

weixin_29200741的博客 328

spm FMRI 各种小问题合集

预处理 1、预处理结果从normalize之后开始头歪、变形 问题描述:如下图 原因:DICOM2NIfTI时必须检查对应的T1像。下面是两种错误形式,第一种容易发现,第二种容易忽视,大脑失状位左右颠倒。 解决:重新转了一回格式,建议用SPM fmri进行格式转换。之前是用MRIconvert转换的,用了两台电脑,有的T1结果是对的,不确定什么原因产生的错位,操作都是一样的。 2、Check reg大脑图片边缘出边框 问题描述: 原因:应该是图片排版导致的,单独check就会发现大脑是全的。 解决

weixin_44669441的博客 1677

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

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

scorpio的博客 822

国产麒麟系统下Kettle安装避坑指南:解决aarch64架构不兼容问题

本文针对在国产麒麟系统上安装Kettle时遇到的aarch64架构不兼容问题,提供了详细的解决方案。通过剖析错误根源,指导用户获取并放置正确的SWT库文件,并修改启动脚本,成功解决“平台不支持”的报错,确保ETL工具在ARM架构的国产化环境中顺利运行。

weixin_29214691的博客 277

Java GoF 23种设计模式-结构型模式-享元模式(Flyweight Pattern)

文章目录一、模式定义二、模式动机三、模式结构四、单纯享元模式4.1、类图结构4.1、代码实现 一、模式定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式,必须有一个工厂类对享元对象进行管理和扩展,工厂尝试重用现有的同类对象,如果未找到匹配的对象,再创建新对象。 二、模式动机 在创建大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,保存在内存中

WU4566285的博客 496

WiFi偏门协议(四):增强的传输机制802.11aa

区分Unicast和Multicast的优先级,以及设定不同的重传次数,以细化EDCA机制。 SCS(StreamClassification Service) 如上图,在VI,VO内各自又增加了一个queue, 对应不同的MAC header。VI和VO内的两个queue可以分别对应UC和MC。这样就提供了同一个AC内的更细粒度的优先级区分。当然还可以使用Drop Eligibility Indication子域来区分不同的重传次数。 改善Multicast数据传...

reekyli的专栏 1790

SAP B1中文培訓教材_SDK

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

23种设计模式之享元模式

23种设计模式之享元模式 文章目录23种设计模式之享元模式参考资料一、简介定义特点通用类图优点缺点应用场景二、享元模式三、总结 参考资料 Java设计模式:23种设计模式全面解析(超级详细) 韩顺平老师的Java设计模式(图解+框架源码剖析) 秦小波老师的《设计模式之禅》 下文如有错漏之处,敬请指正 一、简介 定义 运用共享技术对大量细粒度对象进行复用。 通过共享已经存在的对象、避免大量相似类的开销,从而提高系统资源的利用率。 享元模式中存在以下两种状态: 内部状态,指不会随着环境的改变而改变的可

space_qi的博客 411

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

GOF23设计模式之享元模式-Flyweight

享元模式-Flyweight Pattern简单介绍享元模式-Flyweight概述Coding内部状态和外部状态 本文简单介绍适配器模式 享元模式-Flyweight 概述 运用共享技术有效地支持大量细粒度的对象。 主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创

zhengyong14350的博客 257

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VB摄像头监控

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

Java 之 23 种设计模式解析——12、享元模式(Flyweight)

12、享元模式(Flyweight) 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Jav...

毕富国的博客 486

12、享元模式(Flyweight)

12、享元模式(Flyweight) 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。 FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Java里

普羅●米修斯 ——— HelloWorld 1万+

23种设计模式:23享元模式(Flyweight)

通过共享同一个对象的拷贝,减少对象创建时间和节省内存的使用,从而提高系统性能 场景假设 学校5年级有2个班A、B班,A班和B班分布有100个人,这个时候A、B要分别发布春游计划给同学看,A、B班级的春游计划是不一样的,所以A班同学只看A班的春游计划,而春游计划放在数据库中,我们防止A班同学每次看春游计划的时候都查询并生成一个春游计划,所以我们在A班第一个同学查看春游计划后,就将计划存入内存中,方便...

yuanyuneixin1的专栏 298

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

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33804990的博客 164

23种设计模式一享元模式

享元模式是一种优化内存使用的结构型设计模式,通过共享相似对象来减少内存占用。其核心思想是将对象的内部状态(可共享)与外部状态(不可共享)分离,通过享元工厂管理共享对象池。典型应用场景包括五子棋棋子共享、Java字符串常量池和数据库连接池等。该模式能显著减少对象数量、提高性能,但会增加系统复杂度,且需考虑线程安全问题。适用于存在大量重复对象的系统优化,关键要正确识别可共享的内部状态并合理分离外部状态。

J_liaty的博客 654

Java-23个设计模式 Flyweight 享元模式

Flyweight 主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。 如本例中:用户通过不同品牌的手机发送短信,要求每个品牌只创建一次,当下次有人还要用创建过的对象发信息时,从对象池中拿。 ① 创建一个发信息的接口(可供手机实现) /** * 发送消息的接口 */ pub...

weixin_42321815的博客 191

GOF23设计模式——享元模式(Flyweight)

享元模式 元模式的结构 享元对象能做到共享的关键是区分内蕴状态(Internal State)和外蕴状态(External State)。 一个内蕴状态是存储在享元对象内部的,并且是不会随环境的改变而有所不同。因此,一个享元可以具有内蕴状态并可以共享。 一个外蕴状态是随环境的改变而改变的、不可以共享的。享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到...

技术分享记录 478
上一篇: java 23种常用设计模式之组合模式(Composite)
下一篇: java 23种常用设计模式之策略模式(Strategy)
freedom1993
博客等级 码龄12年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值