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.hqwc.cn/news/234832.html

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

相关文章

PostGIS学习教程八:空间关系

PostGIS学习教程八&#xff1a;空间关系 到目前为止&#xff0c;我们只使用了测量&#xff08;ST_Area、ST_Length&#xff09;、序列化&#xff08;ST_GeomFromText&#xff09;或者反序列化&#xff08;ST_AsGML&#xff09;几何图形&#xff08;geometry&#xff09;的空间…

使用最小花费爬楼梯(力扣LeetCode)动态规划

使用最小花费爬楼梯 题目描述 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶…

企业怎么在社交媒体进行软文推广?媒介盒子为你支招

数字化时代下&#xff0c;社交媒体已经成为企业进行营销推广的重要渠道&#xff0c;在社交媒体进行软文推广&#xff0c;能够提高企业的知名度与曝光度&#xff0c;还能更好地吸引用户关注&#xff0c;从而实现推广目标。但是想要在社交媒体上进行宣传&#xff0c;软文内容是十…

MySQL进阶知识:InnoDB引擎

目录 逻辑存储结构 架构 内存结构 Buffer Pool Change Buffer Adaptive Hash Index Log Buffer 磁盘结构 后台线程 事务原理 redo log undo log MVCC 隐式字段 undo log版本链 readView 逻辑存储结构 这张图在我之前的笔记中出现过&#xff0c;接下来我们详细介…

【C++】: unordered_map的使用

1、概念 key 键值的类型。unordered_map中的每个元素都是由其键值唯一标识的。 T 映射值的类型。unordered_map中的每个元素都用来存储一些数据作为其映射值。 Hash 一种一元函数对象类型&#xff0c;它接受一个key类型的对象作为参数&#xff0c;并根据该对象返回size_t类型…

Docker容器网络模式

1.none网络 1&#xff09;使用默认网络模式创建一个BusyBox容器&#xff0c;用于对比none网络模式&#xff1b; 测试网络&#xff0c;可以正常连接外网。 2&#xff09;再创建一个none网络模式的BusyBox容器&#xff1b; 测试网络连接&#xff0c;无法连接外网。 总结&#x…

什么是木马

木马 1. 定义2. 木马的特征3. 木马攻击流程4. 常见木马类型5. 如何防御木马 1. 定义 木马一名来源于古希腊特洛伊战争中著名的“木马计”&#xff0c;指可以非法控制计算机&#xff0c;或在他人计算机中从事秘密活动的恶意软件。 木马通过伪装成正常软件被下载到用户主机&…

JS之Object.defineProperty方法

给对象添加属性的方法有许多&#xff0c;这次让我为大家介绍一种给对象添加属性的静态方法吧&#xff01; 语法&#xff1a;Objcet.defineProperty(对象的名称&#xff0c;“添加的键名”&#xff0c;{value&#xff1a;键值}) const obj {name:"张三",age:18}// 我…

堆栈_删除字符串所有相邻重复项

//给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 // // 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 // // 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 // // // // 示…

PowerDesigner数据库建模软件的安装

解压&#xff1a; 解压好以后&#xff0c;点击PowerDesigner.exe安装 这个安装的版本是15 选择安装路径&#xff0c;可以默认可以自定义&#xff1a; 直接点next&#xff1a; 全选了 点击next&#xff1a; 点击next&#xff1a; 点finish 汉化&#xff1a; 先把pojie和汉化文件…

window10家庭版中文转专业版流程

1.确认当前为家庭中文版 2.用管理员权限打开cmd窗口 3.输入 dism /online /get-targeteditions &#xff0c;查询当前支持的升级的版本 4.专业版密钥&#xff1a;VK7JG-NPHTM-C97JM-9MPGT-3V66T 5.changepk.exe /productkey VK7JG-NPHTM-C97JM-9MPGT-3V66T

【C++】程序题( STL标准模板库)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…