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

1、模式介绍:

        享元模式是一种结构型设计模式,旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态(可共享)和外部状态(不可共享)来减少内存消耗和提高性能。内部状态存储在享元对象内部,而外部状态则由客户端代码管理和传递。

2、应用场景:

        对象池:当程序中存在大量相似对象且不需要区分其具体身份时,可以使用享元模式。比如线程池、连接池等。
        文本编辑器:对于每一个字符或者格式化文本片段,如果存在大量相同的文本片段,可以共享相同的内部状态,减少内存消耗。
        游戏开发:在游戏中,大量的角色或者粒子对象可能具有相同的外观和行为,可以通过享元模式来节省资源。
        字符串常量池:Java中的字符串常量池就是享元模式的一个实际应用,相同的字符串常量在内存中只存储一份,多个字符串变量可以共享同一个常量。

3、优点:

        减少内存消耗:通过共享相同的对象实例,减少内存使用。
        提高性能:减少了创建对象的时间,特别是在对象频繁被创建和销毁的场景下。

4、缺点:

        可能引入额外的复杂性:需要对内部状态和外部状态进行区分和管理,可能增加系统的复杂度。
        需要合理划分内部状态和外部状态:不正确的划分可能导致系统的逻辑混乱。

5、代码实现:

/*** 享元接口** @author FM_南风* @date 2024/6/27*/
public interface FlyweightInterface {//绘画方法void draw();
}/*** 享元实现类** @author FM_南风* @date 2024/6/27*/
@Data
public class FlyweightClass implements FlyweightInterface{private final String color; // 颜色private int x, y, radius; // 坐标半径public FlyweightClass(String color) {this.color = color;}@Overridepublic void draw() {System.out.println("享元实现类: 绘画 [Color : " + color+ ", x : " + x + ", y :" + y + ", radius :" + radius);}
}/*** 享元工厂** @author FM_南风* @date 2024/6/27*/
public class FlyweightFactory {private static final Map<String, FlyweightInterface> flyweightMap = new HashMap<>();public static FlyweightInterface getCircle(String color) {FlyweightClass flyweightClass = (FlyweightClass) flyweightMap.get(color);if (flyweightClass == null) {flyweightClass = new FlyweightClass(color);flyweightMap.put(color, flyweightClass);System.out.println("开始创作: " + color);}return flyweightClass;}
}/*** 应用** @author FM_南风* @date 2024/6/27*/
public class FlyweightClient {private static final String[] colors = {"红", "绿", "蓝"};public static void main(String[] args) {for (int i = 0; i < 20; ++i) {FlyweightClass circle = (FlyweightClass) FlyweightFactory.getCircle(getRandomColor());circle.setX(getRandomX());circle.setY(getRandomY());circle.setRadius(100);circle.draw();}}private static String getRandomColor() {return colors[(int) (Math.random() * colors.length)];}private static int getRandomX() {return (int) (Math.random() * 100);}private static int getRandomY() {return (int) (Math.random() * 100);}
}

6、结果展示:

7、代码示例说明:

在这个示例中:FlyweightClass类作为具体享元类,颜色(内部状态)color 是享元的一部分,而 x、y、raidus则是外部状态。
FlyweightFactory 类作为享元工厂,负责管理和提供享元对象。享元对象在首次创建时存储在 flyweightMap 中,以便于后续共享使用。
FlyweightClient类作为客户端代码,演示如何使用享元模式来创建和绘制多个圆形对象,共享相同的颜色。
通过享元模式,可以看到多个具有相同颜色的圆形对象共享同一个 FlyweightClass 实例,从而减少了对象的创建和内存消耗。

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

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

相关文章

苏东坡传-读书笔记九

我们论到苏东坡&#xff0c;我们就不能避免“气”这个字。因为每个文学批评家综括苏东坡的个性&#xff0c;必用孟子所说的这个“气”字。 在《孟子》里&#xff0c;“气”是哲学的概念&#xff0c;类似柏格森所说的“生气勃勃”&#xff0c;是人格上的“元气”。使伟人和匹夫显…

419. 甲板上的战舰

419. 甲板上的战舰 题目链接&#xff1a;419. 甲板上的战舰 代码如下&#xff1a; class Solution { public:int countBattleships(vector<vector<char>>& board) {int res0;int rowboard.size(),colboard[0].size();for(int i0;i<row;i){for(int j0;j&l…

深度学习中的Logits处理:InvalidScoreLogitsProcessor详解

深度学习中的Logits处理&#xff1a;InvalidScoreLogitsProcessor详解 基础概念InvalidScoreLogitsProcessor为什么需要这个处理器&#xff1f;使用示例进阶&#xff1a;自定义LogitsProcessor结论 在自然语言处理(NLP)任务中,特别是在使用大型语言模型(LLM)进行文本生成时,我们…

【 2024!深入了解 大语言模型(LLM)微调方法(总结)】

引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起到了非常关键的作用&#xff0c;它提升了模型的生成效率和适应性&#xff0c;使其能够在多样化的应用场景中发挥更大的价值。 那么&…

《C++20设计模式》桥接模式经验分享

文章目录 一、前言二、探讨一个类有多个抽象父类的情况&#xff08;为什么会有桥接&#xff09;三、桥接模式3.1 UML类图3.2 实现 四、最后 一、前言 怎么判断你是否理解桥接模式了呢&#xff1f;&#x1f9d0; 试着回答下面这个问题吧&#xff01;&#x1f60b; 桥接模式到底…

Current request is not a multipart request

看了许多博客的解决方法&#xff0c;感觉还是不太懂&#xff0c;看了这个解决了问题。 从源码角度详细解析

【数据库】范式

文章目录 1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;4. 巴斯-科德范式&#xff08;BCNF&#xff09;5. 第四范式&#xff08;4NF&#xff09;6. 第五范式&#xff08;5NF&#xff0c;又称完美范式&…

heic格式转化jpg有没有免费软件?2024年顶尖的7款heic转jpg工具请收好!

heic格式转化jpg有没有免费软件&#xff1f;heic格式虽然在分辨率上优于jpg&#xff0c;但由于并非所有设备的默认图片格式&#xff0c;许多用户并不太喜欢它。这并不奇怪&#xff0c;因为在非苹果设备上打开HEIC文件可能会遇到困难。因此&#xff0c;人们更倾向于寻找能够免费…

FlinkSQL 开发经验分享

作者&#xff1a;汤包 最近做了几个实时数据开发需求&#xff0c;也不可避免地在使用 Flink 的过程中遇到了一些问题&#xff0c;比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题&#xff0c;通过思考并解决这些问题&#xff0c;加深了我对 Flink 原理与机…

监控与安全服务

kali 系统 nmap扫描 网段的扫描 使用脚本扫描 使用john破解密码 哈希算法是一种单向加密的算法&#xff0c;也就是将原始数据生成一串“乱码”只能通过原始数据&#xff0c;生成这串“乱码”&#xff0c;但是不能通过“乱码”回推出原始数据相同的原始数据&#xff0c;生成的乱…

sql优化-单表优化

文章目录 0、索引优化原则1、在docker内部连接mysql2、数据准备3、创建表 dept 和 emp4、插入50万数据到 emp 表中4.1、创建函数4.2、存储过程4.3、调用存储过程 5、查找姓名以"abc"开头的员工信息5.1、执行计划 select * from emp where name like abc%;5.2、sql优化…

React+TS前台项目实战(二十四)-- 全局常用绘制组件Qrcode封装

文章目录 前言Qrcode组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示(pc端 / 移动端) 总结 前言 今天要封装的Qrcode 组件&#xff0c;是通过传入的信息&#xff0c;绘制在二维码上&#xff0c;可用于很多场景&#xff0c;如区块链项目中的区块显示交易地址时就可以用到…

无线领夹麦克风哪个品牌好,推荐口碑最好的麦克风品牌

在5G网络普及的浪潮下&#xff0c;短视频平台的兴起带动了一股全民创作的热潮。无论是城市街头还是乡间小径&#xff0c;人们纷纷拿起手机&#xff0c;记录生活中的点点滴滴。领夹式麦克风凭借其精准的拾音特性和稳定的信号传输&#xff0c;无论是在静止状态还是在移动过程中&a…

Android什么是OSD层图形?

在Android开发中&#xff0c;OSD&#xff08;On-Screen Display&#xff09;层图形指的是在屏幕上直接显示特定信息的技术&#xff0c;这些信息可以是文字、图标、进度条等&#xff0c;主要用于展示应用程序状态、提示信息、操作指引等。从技术难点、面试官关注点以及回答吸引力…

制作一个静态库

1. 准备工作 # 目录结构 add.c div.c mult.c sub.c -> 算法的源文件, 函数声明在头文件 head.h # main.c中是对接口的测试程序, 制作库的时候不需要将 main.c 算进去 . ├── add.c ├── div.c ├── include │ └── head.h ├── main.c ├── mult.c └── s…

Node.js适合什么场景下使用

Node.js是一个基于Chrome V8 JavaScript引擎构建的开源运行时环境&#xff0c;它允许开发者使用JavaScript在服务器端运行代码。Node.js具有高性能、轻量级、事件驱动和非阻塞I/O等特性&#xff0c;这些特性使得它在多种场景下具有广泛的应用。以下是Node.js适合使用的几个主要…

Protocol Buffers 协议 .proto 文件的编写指南及注意事项

Protocol Buffers&#xff08;简称protobuf&#xff09;是Google提供的一种数据序列化协议(轻便高效) 编写 .proto 文件是定义 gRPC 服务和消息结构等的关键步骤。以下是详细指南&#xff0c;包括编写 .proto 文件的基本语法和注意事项。 1. 基本语法 一个 .proto 文件通常包…

Docker 中的代理

docker 中的代理设置分为两类&#xff1a;docker 使用代理访问网络&#xff1b;docker container 使用代理访问网络。因此要注意区分。 使用代理下载镜像 第一种情况比较适合当下不能直接访问docker官方镜像库的情况。 # 创建配置文件&#xff1b;设置是针对 daemon&#xf…

关于Mysql的InnoDB引擎在长期添加和删除情况下引起的性能问题

场景一&#xff1a; 公司的大数据平台&#xff0c;每天都会从别的节点中同步数据到某个表中&#xff0c;同时这个表要进行大量的删除和添加 问题&#xff1a;在这个表只有2W多条数据的时候&#xff0c;使用一个count(*)语句&#xff0c;数据查询花费了近10秒 原因&#xff1…