java设计模式学习之【对象池模式】

文章目录

  • 引言
  • 对象池模式简介
    • 定义与用途
    • 实现方式
  • 使用场景
  • 优势与劣势
  • 对象池模式在Spring中的应用
  • JDBC对象池示例
  • 代码地址
  • 小结

引言

对象池模式在资源管理和性能优化方面发挥着重要作用。这种模式通过重复使用已经初始化的对象,而不是频繁创建和销毁,减少了系统的开销。这对于处理如数据库连接、线程和图形对象等资源密集型和性能敏感的系统尤为重要。该模式是属于23种设计模式之外的补充模式。

对象池模式简介

定义与用途

对象池模式是一种创建型设计模式,用于管理和重用对象集合。当一个客户端请求一个新对象时,该模式先检查是否有现有的对象可用,而不是创建一个新对象。如果有可用的对象,它将被重用,否则,创建一个新对象并添加到池中。

实现方式

对象池模式通常涉及以下几个关键组件:

  • 对象池类:负责创建和管理对象池。
  • 池化对象:池中管理的对象。
  • 客户端:请求从池中获取对象的用户。
  • 接口/抽象类:定义对象的创建、重用和释放的规范。

工厂方法模式可以用来封装对象的创建逻辑。然而,它在创建之后不管理这些对象,而对象池模式则跟踪它创建的对象。
对象池通常实现为单例。

使用场景

  • 资源重用:当系统中对象的创建和销毁开销显著时。
  • 性能要求:在性能敏感的应用中,减少创建和销毁对象的次数。
  • 资源限制:在资源受限的情况下,如数据库连接或线程池。

优势与劣势

  • 优势
    提高性能:通过重用现有对象减少创建和销毁对象的开销。
    资源管理:有效管理稀缺资源,如数据库连接。
  • 劣势
    管理复杂性:维护对象池增加了系统的复杂性。
    潜在的资源浪费:如果池中对象很少被重用,可能会导致资源浪费。

对象池模式在Spring中的应用

在Spring框架中,并没有直接实现对象池模式,但它提供了相关的支持,使得我们可以方便地实现该模式。例如,Spring的Bean生命周期管理和依赖注入特性可以用于实现自定义的对象池。此外,Spring也提供了与一些常见对象池(如数据库连接池)的集成。

JDBC对象池示例

对象池模式类似于办公室仓库。当新员工被雇佣时,办公室经理需要为他准备工作空间。她会检查办公室仓库是否有备用设备。如果有,她就使用它。如果没有,她就会从亚马逊订购新设备。如果员工被解雇,他的设备会被移动到仓库,以备新工作场所需要时使用。
在这里插入图片描述
第1步
创建一个 ObjectPool 类,用于创建对象的数量。

public abstract class ObjectPool<T> {private long expirationTime;private ConcurrentHashMap<T, Long> locked, unlocked;public ObjectPool() {expirationTime = 30000; // 30 秒locked = new ConcurrentHashMap<T, Long>();unlocked = new ConcurrentHashMap<T, Long>();}protected abstract T create();public abstract boolean validate(T o);public abstract void expire(T o);public synchronized T checkOut() {long now = System.currentTimeMillis();T t;if (unlocked.size() > 0) {Enumeration<T> e = unlocked.keys();while (e.hasMoreElements()) {t = e.nextElement();if ((now - unlocked.get(t)) > expirationTime) {// 对象已过期unlocked.remove(t);expire(t);t = null;} else {if (validate(t)) {unlocked.remove(t);locked.put(t, now);return t;} else {// 对象验证失败unlocked.remove(t);expire(t);t = null;}}}}// 无可用对象,创建一个新的t = create();locked.put(t, now);return t;}public synchronized void checkIn(T t) {locked.remove(t);unlocked.put(t, System.currentTimeMillis());}}

第2步
创建一个实现类,用于获取jdbc连接。

public class JDBCConnectionPool extends ObjectPool<Connection>{private String dsn, usr, pwd;public JDBCConnectionPool(String driver, String dsn, String usr, String pwd) {super();try {Class.forName(driver).newInstance();} catch (Exception e) {e.printStackTrace();}this.dsn = dsn;this.usr = usr;this.pwd = pwd;}@Overrideprotected Connection create() {try {return DriverManager.getConnection(dsn, usr, pwd);} catch (SQLException e) {e.printStackTrace();return null;}}@Overridepublic void expire(Connection o) {try {((Connection) o).close();} catch (SQLException e) {e.printStackTrace();}}@Overridepublic boolean validate(Connection o) {try {return !((Connection) o).isClosed();} catch (SQLException e) {e.printStackTrace();return false;}}}

第三步
测试类允许应用程序借用和归还数据库连接:

public class Main {public static void main(String args[]) {// 做一些事情...// 创建 ConnectionPool:JDBCConnectionPool pool = new JDBCConnectionPool("org.hsqldb.jdbcDriver", "jdbc:hsqldb://localhost/mydb","sa", "secret");// 获取一个连接:Connection con = pool.checkOut();// 使用连接// 归还连接:pool.checkIn(con);}}

这个示例展示了如何使用对象池模式管理和重用数据库连接,以优化资源使用和提高性能。

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

小结

至此,创建型的6种设计模式的总结完成,感兴趣的同学可以看看之前的博客。

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

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

相关文章

解决tailwind与element样式冲突

解决tailwind与element样式冲突 一、问题描述1.环境&#xff1a;2.问题3.原因 二、解决方法1.在tailwind.config.js中关闭默认样式2.拷贝Tailwind默认样式修改并引用3.在main.js中引用preflight.css 一、问题描述 1.环境&#xff1a; TailwindCSS Element plus 2.问题 el-…

现代 C++ 函数式编程指南

现代 C 函数式编程指南 什么是 柯里化 &#xff08;Curry&#xff09;什么是 部分应用 &#xff08;Partial Application&#xff09; 二元函数 &#xff08;Partial Application&#xff09;参数排序 &#xff08;Partial Application&#xff09; 应用场景 计算碳衰减周期求年…

基于Java SSM框架实现汽车在线销售系统项目【项目源码+论文说明】

基于java的SSM框架实现汽车在线销售系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&a…

quick_快应用_广告接入

目录 接入厂商广告oppo广商接入广告banner广告信息流广告[1] 组件封装[2] 渲染数据[3] 测试[4] 样式调整[5] 加载失败[6] 预加载[7] 应用要素信息 接入厂商广告 广告接口 [1] 接口声明 {"name":"service.ad"}[2] 导入模块 import ad from service.ad 或 c…

[FUNC]判断窗口在哪一个屏幕上

#Requires AutoHotkey v2.0#z:: { ToolTip "Notepad窗口所在显示屏是&#xff1a;" GetMonitor() } GetMonitor() {CoordMode("Mouse", "Screen"); MouseGetPos &mx, &myWinGetPos &mx, &my,,,"ahk_class Notepad"…

【小布_ORACLE笔记】Part11-6 RMAN Backups

【小布_ORACLE笔记】Part11-6 RMAN Backups 1.track文件的作用 当做差异性备份时&#xff0c;server process对应的RMAN客户端的server process就不用去每个块每个块的检查&#xff0c;只要到trackfile 里面去读一下&#xff0c;看哪个块改变了就直接把哪个块备份下来&#x…

matlab 混沌动力学行为-分岔图-李雅普指数等

1、内容简介 略 24-可以交流、咨询、答疑 2、内容说明 混沌动力学行为-分岔图-李雅普指数等 包含各种类型的混沌模型求解&#xff0c;包含其分叉图、李雅普指数等 混沌、分叉图、李雅普指数 3、仿真分析 略 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/…

无限移动的风景 css3 动画 鼠标移入暂停

<style>*{margin:0;padding:0;/* box-sizing: border-box; */}ul{list-style: none;}#nav{width:900px;height:100px;border:2px solid rgb(70, 69, 69);margin:100px auto; overflow: hidden;}#nav ul{animation:moving 5s linear infinite;width:200%; /*怎么模拟动画…

【已解决】Cannot find project Scala library 2.11.8 for module XXX

问题描述 在 flink 示例程序调试过程中&#xff0c;reload project 报错 Cannot find project Scala library 2.11.8 for module HbasePrint 报错如下图所示&#xff1a; 问题解决 经过搜索&#xff0c;初步判定是 pom 文件中 Scala 版本配置和项目中实际使用的版本不一致导…

在 SQL Server 中备份和恢复数据库的最佳方法

在SQL Server中&#xff0c;创建备份和执行还原操作对于确保数据完整性、灾难恢复和数据库维护至关重要。以下是备份和恢复过程的概述&#xff1a; 方法 1. 使用 SQL Server Management Studio (SSMS) 备份和还原数据库 按照 SSMS 步骤备份 SQL 数据库 打开 SSMS 并连接到您…

什么是OV SSL证书?

OV SSL证书是组织验证SSL证书的缩写&#xff0c;是三个SSL验证级别之一的名称。 OV是指实名类型的SSL证书&#xff0c;这个实名其实只要证明发布者身份就可以签发&#xff0c;无论是个人还是企业都可以进行申请。 SSL证书大家都知道就是用于网站地址的http改成https加密协议的…

Redis部署-主从模式

目录 单点问题 主从模式 解析主从模式 配置redis主从模式 info replication命令查看复制相关的状态 断开复制关系 安全性 只读 传输延迟 拓扑结构 数据同步psync replicationid offset psync运行流程 全量复制流程 无硬盘模式 部分复制流程 积压缓冲区 实时复…

如何生成纯文本的目录树

参考资料&#xff1a; https://ascii-tree-generator.com/ 无需多言&#xff0c;感谢这些前辈的智慧。界面如下&#xff1a;

河南省第一届职业技能大赛网络安全项目试题

河南省第一届职业技能大赛 网络安全项目试题 一、竞赛时间 总计&#xff1a;420分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 240分钟 200分 A-2 Web安全加固&#xff08;Web&#xff09; A-3 流量完整性保护与事件监控&am…

【AB平台数据建设】从实验平台到数据管道

文章目录 前言1.从AB实验平台聊起(1)AB平台在业务中的发挥那些作用(2)AB平台进行实验工作流介绍 2.实验平台底层数据管道最小MVP解构(1)数据管道数据从哪里来&#xff1f;(2)数据管道的输出数据有哪些&#xff1f; 小结 前言 AB实验平台是一种通过小范围放量&#xff0c;测试不…

Python 网络爬虫(一):HTML 基础知识

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 什么是 HTML2. HTML 的特点3. HTML 的标签和属性4. HTML 的结构4.1 文档类型声明4.2 根元素4.3 头部部分4.4 主体部分4.5 表格标签4.6 区块4.7 嵌套和层次结构4.8 表单4.9 注释 5. HTML 交互事件 大家好&#xff0c;我是…

#zookeeper集群+kafka集群

kafka3.0之前是依赖于zookeeper的。 zookeeper是开源&#xff0c;分布式的架构。提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式涉及的分布式服务管理架构。 存储和管理数据。分布式节点上的服务接受观察者的注册。一旦分布式节点上的数据发生变化&#xf…

【快速见刊|投稿优惠】2024年机电一体与自动化技术国际学术会议(IACMAT 2024)

2024年机电一体与自动化技术国际学术会议(IACMAT 2024) 2024 International Academic Conference on Mechatronics and Automation Technology(IACMAT 2024) 一【会议简介】 2024年机电一体与自动化技术国际学术会议(IACMAT 2024)即将召开&#xff0c;它以“机电一体&#xff0…

2023年【安全员-B证】最新解析及安全员-B证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-B证最新解析是安全生产模拟考试一点通生成的&#xff0c;安全员-B证证模拟考试题库是根据安全员-B证最新版教材汇编出安全员-B证仿真模拟考试。2023年【安全员-B证】最新解析及安全员-B证免费试题 1、【多选题…

用友U8 ERP和面粉行业专版系统接口集成方案

面粉加工行业面临着数据管理和业务流程自动化的挑战。众诚ERP系统和用友U8系统的数据集成是解决这一挑战的关键。 解决方案 轻易云平台提供了一套完善的数据同步和集成解决方案&#xff0c;包括以下几个方面&#xff1a; 基础资料同步&#xff1a;包括物料、客户、供应商、仓…