Java23种设计模式-结构型模式之享元模式

devtools/2024/11/15 4:46:06/

享元模式(Flyweight Pattern):主要用于减少创建大量相似对象时的内存占用通过共享对象,享元模式可以减少内存中对象的数量,从而提高程序性能。

角色
1.享元角色(Flyweight):享元对象包含了可以共享的内在状态。
2.享元工厂(Flyweight Factory):管理享元对象池,确保合理地共享享元对象。
3.客户端(Client):客户端使用享元工厂来获取享元对象,并与外部状态一起使用。

优点:
1.节省内存:通过共享已存在的对象,减少对象的创建数量,节省内存资源。
2.提高性能:减少了创建和销毁对象的开销,提高系统性能。
3.降低内存占用:避免了大量相似对象的存储。
4.更好的资源利用:有效地利用有限的资源。

缺点:
1.复杂性增加:需要额外的代码来管理享元对象,增加了系统的复杂性。
2.状态管理复杂:对象的状态可能会变得复杂,需要仔细处理。
3.线程安全性:在多线程环境下,需要考虑线程安全问题。
4.代码可读性降低:复杂的享元模式实现可能会降低代码的可读性。
5.维护困难:代码的复杂性增加可能导致维护困难。
6.限制灵活性:可能对系统的灵活性产生一定的限制。
7.依赖享元工厂:系统过于依赖享元工厂,可能导致耦合性增加。
8.性能权衡:在某些情况下,可能会因为享元的共享而导致一定的性能损失。
9.代码复杂度上升:实现享元模式可能会增加代码的复杂度和开发成本。
10.不易测试:复杂的结构可能使测试变得困难。

应用场景:
1.系统中存在大量相似的对象。
2.对象的创建和销毁开销较大。
3.内存资源有限,需要节省内存。

示例:ConcreteFlyweight 是享元角色,FlyweightFactory 是享元工厂,客户端通过工厂获取享元对象,并提供外在状态来使用它们

// 享元接口
public interface Flyweight {void operation(String extrinsicState);
}
// 具体享元类
public class ConcreteFlyweight implements Flyweight{private String intrinsicState;public ConcreteFlyweight(String intrinsicState) {this.intrinsicState = intrinsicState;}@Overridepublic void operation(String extrinsicState) {// 使用内在状态和外在状态执行操作System.out.println("操作: " + intrinsicState + " 附加状态: " + extrinsicState);}
}
//享元工厂
public class FlyweightFactory {private static HashMap<String, Flyweight> flyweights = new HashMap<>();public static Flyweight getFlyweight(String key) {if (!flyweights.containsKey(key)) {flyweights.put(key, new ConcreteFlyweight(key));}return flyweights.get(key);}
}
//客户端
public class Client {public static void main(String[] args) {Flyweight flyweight1 = FlyweightFactory.getFlyweight("shared intrinsic state 1");flyweight1.operation("extrinsic state 1");Flyweight flyweight2 = FlyweightFactory.getFlyweight("shared intrinsic state 2");flyweight2.operation("extrinsic state 2");}
}

http://www.ppmy.cn/devtools/15205.html

相关文章

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(三)、功能仿真测试

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 本次实验&#xff08;二&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天…

webpack -vite(Rollup )-Gulp (一)

vite基于什么打包 Vite 是一个现代的前端构建工具&#xff0c;它在开发环境中利用浏览器原生的 ES 模块加载机制实现快速启动和热更新&#xff0c;而在生产环境打包时&#xff0c;默认基于 Rollup 进行构建。Rollup 是一个JavaScript 模块打包器&#xff0c;尤其擅长处理 ES 模…

SSTV音频转图片

SSTV工具有很多&#xff0c;这里使用RX-SSTV慢扫描工具 下载安装 RX-SSTV解码软件 下载地址&#xff1a;https://www.qsl.net/on6mu/rxsstv.htm 一直点下一步&#xff0c;安装成功如下图: 虚拟声卡e2eSoft 由于SSTV工具是根据音频传递图片信息&#xff0c;正常解法需要一…

go版本1.16.5 运行项目出现undefined: math.MaxInt报错

问题描述 go版本 go1.16.5 项目引用了 包go-sqlite3 v1.14.17 github.com/mattn/go-sqlite3 v1.14.17运行报错 # github.com/mattn/go-sqlite3 D:\GoPATH\pkg\mod\github.com\mattn\go-sqlite3v1.14.17\sqlite3_opt_serialize.go:41:26: undefined: math.MaxInt原因分析&…

npm常用的命令大全(2024-04-21)

nodejs中npm常见的命令 npm主要是node包管理和发布的工具。 npm官网网址&#xff1a;npm | Homehttps://www.npmjs.com/官网英文文档&#xff1a; npm DocsDocumentation for the npm registry, website, and command-line interfacehttps://docs.npmjs.com/about-npm官网中文文…

【java毕业设计】 基于Spring Boot+mysql的课程作业管理系设计与实现(程序源码)-课程作业管理系

基于Spring Bootmysql的课程作业管理系设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring Bootmysql的课程作业管理系设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方…

Java数据类型和变量

一.字面常量 常量即在程序运行期间不变的的量。 字面常量的分类&#xff1a; 1.字符串常量&#xff1a;“内容”&#xff0c;双引号里的内容&#xff1b; 2.整形常量&#xff1a;100&#xff0c;像这样的&#xff1b; 3.浮点数常量&#xff1a;1.23&#xff0c;直接写的浮…

Laravel 6 - 第十章 路由

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …