设计模式-享元模式(结构型)

享元模式

享元模式是一种结构型模式,它主要用于减少创建对象的数量,减少内存占用。通过重用现有对象的方式,如果未找到匹配对象则新建对象。线程池、数据库连接池、常量池等池化的思想就是享元模式的一种应用。

图解

请添加图片描述

角色

  1. 享元工厂:负责创建和管理享元对象,通常包含一个池用于存储和复用已经创建的享元对象
  2. 具体享元:实现抽象元接口,包含内部和外部状态,内部状态可被分享,外部状态由客户端传递
  3. 抽象享元:定义具体享元和非共享享元接口,通常包含设置外部状态的方法
  4. 客户端:使用享元工厂获取享元对象,并通过设置外部状态来操作享元对象。客户端通常不需要关心享元对象的具体实现

代码实现

抽象享元

public interface Connection {void get();
}

具体享元

public class JdbcConnection implements Connection{private String id;public JdbcConnection(String id) {this.id = id;}@Overridepublic void get() {System.out.println("连接ID为:" + this.id);}
}

享元工厂

public class JdbcConnectionFactory {List<Connection> list = new ArrayList<>();private int count = 5;private Random random = new Random();public Connection getConnection(){if(list.size() < count){JdbcConnection jdbcConnection = new JdbcConnection(UUID.randomUUID().toString());list.add(jdbcConnection);return jdbcConnection;}else {int i = random.nextInt(4);return list.get(i);}}
}

客户端

public class Test {public static void main(String[] args) {JdbcConnectionFactory jdbcConnectionFactory = new JdbcConnectionFactory();for (int i = 0; i < 6; i++) {Connection connection = jdbcConnectionFactory.getConnection();connection.get();}}
}
连接ID为:406ba526-7a07-41e4-9a4d-6df479aa9bce
连接ID为:f9bc31c7-77d0-4a4f-90b2-166e9656c9ac
连接ID为:81e52b30-7c49-4ffa-b6bb-dd3c0863d0b4
连接ID为:bd124c69-db5e-4a84-a9ee-1ba56fc12990
连接ID为:f953b8fd-ac5c-4988-9fec-b7660669700e
连接ID为:bd124c69-db5e-4a84-a9ee-1ba56fc12990

最多产生五个连接对象

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

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

相关文章

如何在WordPress中上传多种安装包文件

WordPress默认情况下不允许上传某些类型的文件&#xff0c;如应用安装包文件&#xff08;如APK、EXE、DMG等&#xff09;。为了实现上传这些文件&#xff0c;我们需要调整WordPress的文件上传限制。本文将详细介绍如何在WordPress中上传Windows、Mac、Linux、Android、iOS和Har…

web前端图片分区:深入探索其原理、应用与未来趋势

web前端图片分区&#xff1a;深入探索其原理、应用与未来趋势 在web前端开发中&#xff0c;图片分区作为一种优化技术&#xff0c;正逐渐受到开发者的青睐。通过将大型图片划分为多个小区块&#xff0c;图片分区能够实现更高效的加载和渲染&#xff0c;从而提升用户体验。本文…

Python第二语言(五、Python文件相关操作)

目录 1. 文件编码的概念 2. 文件的读取操作 2.1 什么是文件 2.2 open()打开函数 2.3 mode常用的三种基础访问模式 2.4 文件操作及案例 3. 文件的写入操作及刷新文件&#xff1a;write与flush 4. 文件的追加操作 5. 文件操作的综合案例&#xff08;文件备份操作&#x…

Linux文件系统讲解!

一、Linux文件系统历史 1、在早期的时候Linux各种不同发行版拥有自己各自自定义的文件系统层级结构。 2、当我用Red hat转向玩Debian时&#xff0c;我进入/etc我都是懵的。 3、后来Linux社区做了一个标准、FHS&#xff08;文件系统标准层次结构&#xff09;。来帮助Linux系统的…

1_常见指令【Linux中常见30个指令的学习和使用】【万字长文】

常见指令以及权限理解 开始学习linux前的注意事项 在学习linux之前&#xff0c;我们要知道linux是一个操作系统。 那操作系统是什么呢&#xff1f;&#xff08;这里只做大概了解&#xff09; 操作系统就是一个管理软硬件的软件。 它对上提供良好&#xff08;稳定、高效、安…

做材料科学领域研究热点:高通量多尺度材料计算和机器学习

研究背景 材料科学是一个重要领域&#xff0c;涉及物质的研究和利用。随着科技进步&#xff0c;材料学已成为多学科交叉的前沿领域之一&#xff0c;融合物理、化学、数学、信息、力学和计算科学等知识。寻找更坚固的新材料已成为当今急需解决的问题。 材料基因工程作为一项颠覆…

Spring boot 注解实现幂等性

1. 添加 Spring AOP 依赖 在 pom.xml 中添加如下依赖&#xff1a; <dependencies><!-- Spring AOP dependency --><dependency><groupIdorg.springframework.boot</groupId><artifactIdspring-boot-starter-aop</artifactId></depend…

C++入门小结

C命名空间总结 C 中的命名空间&#xff08;Namespace&#xff09;是一种组织代码的方式&#xff0c;用于避免全局命名冲突。在同一个命名空间中&#xff0c;可以有相同名称的变量、函数和类&#xff0c;但它们彼此互不影响。下面是对 C 命名空间的一些总结&#xff1a; 定义命…

使用Java实现自定义的ClassLoader

Java类加载机制是Java虚拟机&#xff08;JVM&#xff09;中非常重要的部分&#xff0c;它负责将字节码加载到内存中&#xff0c;并生成对应的Class对象。在Java中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是这一过程的核心组件。了解和实现自定义的ClassLoader…

IOS中使用input页面被聚焦放大

IOS中使用input页面被聚焦放大 解决方案&#xff1a; 第一步&#xff0c;head标签中设置如下meta <meta name"viewport" content"widthdevice-width,initial-scale1.0,user-scalableno">第二步&#xff0c;增加如下meta <!--兼容ios设备input聚…

长亭Nginx入门

在学习Nginx时我们先学习下防火墙原理】 将流量代理给防火墙 这样WAF 会分析流量 防火墙安装网络拓扑图 流量给防火墙 再给负载均衡 反向代理这个网络拓扑图是 防火墙充当了反向代理角色 所以我们就知道了我们为了要学习Nginx 因为这个服务器支持很多功能模块 自己本身就能…

开源项目-Docker部署学之思管理系统

开源-Docker部署学之思管理系统 文章目录 开源-Docker部署学之思管理系统资源列表基础环境一、安装Docker二、配置加速器三、查看Docker版本四、Git获取源码五、编辑SQL脚本六、访问管理系统如果访问或者登录的时候出现内部服务错误&#xff0c;评论或私信&#xff0c;我给你解…

Cisco Packet Tracer实验(三)

续实验二 问题一&#xff1a;使用二层交换机连接的网络需要配置网关吗&#xff1f;为什么&#xff1f; 二层交换机作为网络设备中的一种&#xff0c;主要用于在局域网&#xff08;LAN&#xff09;内部进行数据包的转发。它工作在OSI模型的第二层&#xff08;数据链路层&#xf…

超维小课堂 | 7、ROS使用offboard模式控制无人机定点悬停源码分析

引言&#xff1a;ROS使用offboard模式控制无人机进入定点悬停是学习ROS无人机控制的最经典的基本功能之一。基于此&#xff0c;本篇主要对此处的控制流程著一个简要的代码分析。&#xff08;室内外通用代码&#xff09; 顾名思义&#xff1a;offboard模式下的定点悬停是指通过…

SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则

SpringSecurity6从入门到实战之SpringSecurity6自定义认证规则 Spring Security 中默认所有的 http 请求都需要先认证通过后&#xff0c;才能访问。那么&#xff0c; 如何指定不需要认证就可以直接访问的资源呢&#xff1f;比如 用户的登录页面和注册页面&#xff0c;都是不需要…

ramda函数式编程库--可以帮助处理不可变数据

ramda 介绍深拷贝与浅拷贝示例代码**使用 clone 函数****clone 函数也可以用来深拷贝数组&#xff1a;** 介绍 ramda 是一个功能强大的函数式编程库&#xff0c;可以帮助你处理不可变数据。 clone 是 ramda 中的一个函数&#xff0c;用于深拷贝对象或数组。以下是关于 clone 函…

内网管理软件IP-Guard实施方案

1. 引言 本方案旨在指导企业如何实施内网管理软件IP-Guard&#xff0c;通过服务器的安装、员工客户端的部署以及基本策略的定制&#xff0c;实现对企业内部网络的有效管理和监控。IP-Guard是一款集成了设备管控、数据防泄漏、日志审计等多种功能于一体的内网安全管理软件&…

【面试干货】深入理解Java中的final关键字

【面试干货】深入理解Java中的final关键字 一、被 final 修饰的类二、被 final 修饰的方法三、被 final 修饰的变量四、被 final 修饰的常量 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;final关键字有多种用途&…

C++ Primer 学习 -- Day 1

第 1、2 章知识点总结 1、Hello&#xff0c;World&#xff01;1.1、输入输出1.2、while(std::cin >> value) 2、变量和基本类型2.1.1、unsigned建议 2.1.2 类型转换建议建议 2.2.1 变量定义提醒列表初始化提醒 2.2.2 变量声明和定义提醒 2.3.1 引用引用特点 2.3.2 指针指…

快人一步!利用LLM实现数据处理自动化

使用大型语言模型&#xff08;LLM&#xff09;来帮助处理数据具有以下几个主要优势&#xff1a; 1. 自动化处理 LLM能够自动处理大量的重复性任务&#xff0c;减少人工干预&#xff0c;从而提高数据处理效率。例如&#xff0c;它可以自动完成数据加载、预处理、筛选、去重和合并…