探索Java设计模式:享元模式

探索Java设计模式:深入理解与实践享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来有效地支持大量细粒度对象的复用,从而降低系统内存占用,提高性能。在Java编程中,享元模式常用于优化大量相似对象的创建和管理。本文将通过简要介绍、实现示例及实际运用等模块,帮助读者全面掌握享元模式及其在Java环境下的应用。

一、简要介绍

享元模式的核心思想是运用共享技术有效地支持大量细粒度对象的复用。它通过共享已经存在的同类对象,减少系统中对象的数量,从而降低内存占用,提高系统的性能。享元模式的关键在于区分对象的内在状态(Intrinsic State,存储在享元对象内部,不会随环境改变而改变)和外在状态(Extrinsic State,由客户端传入,随环境改变而改变)。

享元模式主要涉及以下角色:

  • Flyweight(享元接口):定义享元对象的公共接口,通常包含外在状态的设置方法。
  • ConcreteFlyweight(具体享元类):实现Flyweight接口,存储享元对象的内在状态,并提供享元对象的共享实现。
  • FlyweightFactory(享元工厂):负责创建和管理享元对象,确保享元对象的共享。客户端通常通过工厂获取享元对象,而非直接创建。

享元模式的主要优点包括:

  • 减少对象创建数量:通过共享已经存在的对象,避免大量相似对象的创建,降低系统内存消耗。
  • 提高系统性能:减少对象数量意味着减小GC压力,提高内存利用率,从而提升系统性能。
  • 支持大量细粒度对象:适用于需要处理大量相似对象的场景,通过享元模式可以有效地管理这些对象。

二、实现示例

以绘制大量相同颜色的小方块为例,使用享元模式共享颜色对象,降低内存占用:

1. 享元接口与具体享元类

// 享元接口:Color
public interface Color {void apply(ColorContext context);
}// 具体享元类:ConcreteColor
public class ConcreteColor implements Color {private final String colorName;public ConcreteColor(String colorName) {this.colorName = colorName;}@Overridepublic void apply(ColorContext context) {System.out.println("Applying color " + colorName + " to context: " + context.getContextId());}
}

2. 享元工厂

import java.util.HashMap;
import java.util.Map;// 享元工厂:ColorFactory
public class ColorFactory {private static Map<String, Color> colorPool = new HashMap<>();public static Color getColor(String colorName) {if (!colorPool.containsKey(colorName)) {colorPool.put(colorName, new ConcreteColor(colorName));}return colorPool.get(colorName);}
}

3. 客户端代码

// 外在状态:ColorContext
public class ColorContext {private final String contextId;public ColorContext(String contextId) {this.contextId = contextId;}public String getContextId() {return contextId;}
}public class DrawingApp {public static void main(String[] args) {Color red = ColorFactory.getColor("Red");Color blue = ColorFactory.getColor("Blue");ColorContext context1 = new ColorContext("Context 1");ColorContext context2 = new ColorContext("Context 2");red.apply(context1); // 输出:Applying color Red to context: Context 1red.apply(context2); // 输出:Applying color Red to context: Context 2blue.apply(context1); // 输出:Applying color Blue to context: Context 1blue.apply(context2); // 输出:Applying color Blue to context: Context 2}
}

三、实际运用

享元模式在Java开发中有着广泛的应用,以下列举几个典型场景:

1. 字符串常量池

Java中的字符串常量池就是享元模式的一个典型应用。当创建字符串对象时,系统会首先检查字符串常量池中是否存在相同的字符串。如果存在,则返回已有的字符串对象;如果不存在,则创建新的字符串对象并放入常量池。

2. 图形组件库

在图形组件库中,大量使用相同的颜色、字体、图标等资源。通过享元模式,可以共享这些资源对象,减少内存占用,提高性能。

3. 数据库连接池

数据库连接池是一种优化数据库资源管理的技术,通过享元模式复用已建立的数据库连接,避免频繁创建和销毁连接带来的性能开销。

4. 缓存系统

缓存系统如Redis、Memcached等,通过存储热点数据的副本,减少对原始数据源的访问,提高数据访问速度。这里的热点数据副本可以视为享元对象。

5. HTML解析器

在HTML解析过程中,可能会遇到大量相同的标签、属性等元素。使用享元模式共享这些元素对象,可以有效减少内存消耗。

总结而言,享元模式通过共享已经存在的对象,减少了系统中对象的数量,降低了内存占用,提高了性能。在Java开发过程中,享元模式适用于需要处理大量相似对象、优化内存使用、提高系统性能的场景。合理运用享元模式,可以提升系统的资源利用率和响应速度。

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

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

相关文章

【2024】深度学习配置环境常见报错,持续更新中....

No such file or directory: ‘:/usr/local/cuda-10.1:/usr/local/cuda-10.1/bin/nvcc‘: 确保CUDA正常后&#xff0c;直接运行以下代码&#xff1a; export CUDA_HOME/usr/local/cuda详细原因参照&#xff0c;安装mmcv-full时报错&#xff1a;Could not build wheels for mm…

python多线程技术(Threading)

文章目录 前言一、多线程(Threading)是什么?二、threading库1.初识多线程2.增加新线程2.1 多线程的基本使用2.2 对多线程是同时进行的进行一个直观上的演示(非重点--理解是实时就行)2.3 thread.join()功能2.4 使用queue(队列)功能获取多线程的返回值(重要,这就是前面那…

R version 4.1.0 安装ggplot2,options(pkgType=“binary“) install.packages(“ggplot2“)

R version 4.1.0 安装ggplot2 R version 4.1.0 安装ggplot21. 报错信息2. 成功安装3. 参考资料 R version 4.1.0 安装ggplot2 # 直接安装报错 install.packages("ggplot2")# 安装成功 options(pkgType"binary") install.packages("ggplot2")1. …

浅析ARM Contex-CM3内核架构

目录 概述 1. Cortex-M3类型MCU 1.1 MCU 架构 1.2 实时性系统概念 1.3 处理器命名法 1.4 MCU的一些知识 2. Cortex-M3 概览 2.1 Cortex-M3综述 2.2 寄存器组 2.3 操作模式和特权极别 2.4 内建的嵌套向量中断控制器 2.5 存储器映射 2.6 总线接口 2.7 存储器保护单元…

SpringBoot多数据源(一)

SpringBoot多数据源&#xff08;一&#xff09; 1.多数据源使用场景1.1 业务复杂&#xff08;数据量大&#xff09;1.2 读写分离 2.多数据源配置3.应用4.测试 1.多数据源使用场景 1.1 业务复杂&#xff08;数据量大&#xff09; 简单理解就是业务量复杂&#xff0c;将庞大的数…

Python模块之logging

官方文档 常见用法 logging模块是Python标准库中用于记录日志的模块。它提供了灵活且可配置的日志记录功能&#xff0c;可以用于在应用程序中捕获和输出各种级别的日志消息。以下是logging模块的常见用法示例&#xff1a; python import logging# 配置日志记录器 logging.b…

Java中的==与equals的区别

区别 首先&#xff0c;是运算符&#xff0c;equals()是方法 是一个二元运算符&#xff0c;用于比较两个对象的引用是否相同。当使用 进行比较时&#xff0c;Java会检查两个对象的内存地址是否相同。如果两个对象的内存地址相同&#xff0c;则认为它们是相同的。 如果比较的…

浏览器原理之本地存储

一 浏览器本地存储方式及使用场景 Cookies: 小段数据&#xff0c;由服务器发送到用户浏览器&#xff0c;浏览器将其存储并在以后的请求中回送到服务器。使用场景&#xff1a;会话管理&#xff08;登录状态、用户偏好设置&#xff09;、个性化&#xff08;用户主题&#xff09;、…

本地消息表模式保障分布式系统最终一致性

系统架构说明 状态转换说明 订单表消息表process_queue库存系统return_queue说明成功失败///订单库回滚成功成功失败//订单系统重发消息成功成功成功失败/Broker自动重试&#xff0c;注意接口幂等成功成功成功库存不足退回/Broker通知回掉&#xff0c;订单/消息作废成功成功成…

车轮上的智能:探索机器学习在汽车行业的应用前景

文章目录 引言&#xff1a;一、机器学习在汽车设计中的应用设计优化模拟与测试 二、智能制造与生产三、自动驾驶技术感知与决策数据融合 四、市场与模式的变革五、机器学习对于汽车行业的机遇与挑战挑战机遇 引言&#xff1a; 在当今数字化时代&#xff0c;机器学习作为人工智…

速盾:cdn可以加速哪些服务器

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种通过将网站的静态资源部署到全球各地的服务器上&#xff0c;以提供更快速、更可靠的访问体验的技术。CDN可以加速许多类型的服务器&#xff0c;包括但不限于以下几种&#xff1a; 静态资源服…

全方位解析:深入了解Microsoft Edge浏览器的优势与特性

目录 1. 速度快&#xff1a; 2. 内存占用低&#xff1a; 3. 集成性好&#xff1a; 4. 支持Web标准&#xff1a; 5. 定制化选项&#xff1a; 6. 阅读模式和笔记功能&#xff1a; 7. 搜索引擎优化&#xff1a; 8. 扩展程序库&#xff1a; 9. 跨平台同步&#xff1a; 10…

android学习笔记(四)

1、ExampleInstrumentedTest的解读&#xff1a; /*** Instrumented test, which will execute on an Android device.** see <a href"http://d.android.com/tools/testing">Testing documentation</a>*/ RunWith(AndroidJUnit4.class) public class Exa…

Kafka -基本概念

认识Kafka kafka是一个多分区、多副本、基于zookeeper协调的分布式消息系统。 扮演角色 消息系统存储系统&#xff1a;把消息持久化到磁盘&#xff0c;相比于其他基于内存存储的系统而言&#xff0c;有效降低了数据丢失的风险。流式处理平台 基本概念 kafka的体系结构&…

Python爬虫-批量爬取Manner Coffee全国门店

前言 本文是该专栏的第25篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者在文章《Python爬虫-批量爬取星巴克全国门店》里面有详细介绍采集全国门店的方法以及完整代码思路。对此领域感兴趣的同学,可以点击翻阅查看即可。 而在本文中,笔者将详细来介…

【离散数学】关系

一、序偶和笛卡尔积 序偶&#xff1a;两个元素按照一定的次序组成的二元组&#xff0c;记为<x,y>&#xff0c;x为第一元素&#xff0c;y为第二元素 序偶的相等条件&#xff1a;<a,b><c,d>当且仅当ac,bd n重有序组&#xff1a;n个元素按照一定次序组成的n元…

前端css中table表格的属性使用

前端css中table表格的属性使用 一、前言二、常见的表格属性1.边框的样式2.布局和对齐3.间距和填充4.背景和颜色5.字体的样式6.边框的圆角 三、简单的表格&#xff0c;例子11.源码12.源码1效果截图 四、给表格添加动画效果&#xff0c;例子21.源码22.源码2的运行效果 五、结语六…

kkFileView 任意文件上传致远程代码执行漏洞复现(QVD-2024-14703)

0x01 产品简介 kkFileView 是使用 spring boot 搭建的文件文档在线预览解决方案,支持主流办公文档的在线预览。 0x02 漏洞概述 2024年4月,互联网上披露kkFileView远程代码执行漏洞情报,攻击者可利用该漏洞上传恶意文件,获取操作系统权限。该漏洞利用简单,建议受影响的客…

大数据学习的第三天

文章目录 学习大数据命令的方式查看文件拷贝文件的方式添加数据的方式 出现了问题移动文件 hadoop工作流程和工作机制的方式namenodedatanodesecondarynamenode(主节点) 学习大数据命令的方式 查看文件 hadoop fs -cat /test/2.txt下载文件 hadoop fs -get -f /test/2.txt-f …

基于深度学习的脑部肿瘤检测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 当大脑中形成异常细胞时&#xff0c;就会发生脑肿瘤。肿瘤主要有两种类型&#xff1a;癌性&#xff08;恶性&#xff09;肿瘤和良性肿瘤。恶性肿瘤可分为原发性肿瘤和继发性肿瘤&#xff0c;前者始…