对象池模式-Object Pool Pattern

原文地址:https://jaune162.blog/design-pattern/object-pool-pattern/
原文中可下载高清SVG矢量类图

引言

对象池模式(Object Pool Pattern)是一种创建一组可重用对象的设计模式。它通过维护一个预分配的对象集合,避免了频繁地创建和销毁对象所带来的性能开销。在需要使用对象时,可以直接从池中获取,而不需要每次都创建新的对象;当对象不再使用时,可以将其归还到池中,而不是直接销毁。

对象池模式的主要优点是减少了对象的创建和销毁的开销,提高了程序的性能。此外,它还有助于控制资源的使用,避免资源的浪费。然而,对象池模式也有一些缺点,如增加了代码的复杂性,以及可能导致内存占用过高。

对象池模式并不是GoF中的23种设计模式

定义及实现

定义

When objects are expensive to create and they are needed only for short periods of time it is advantageous to utilize the Object Pool pattern. The Object Pool provides a cache for instantiated objects tracking which ones are in use and which are available.

当对象的创建成本很高并且只在很短的周期内使用,那么对象池模式就很有优势。对象池提供一个对象示例的缓存来跟踪那个对象正在使用,哪个对象是可用的。

结构

在这里插入图片描述

代码实现

@Slf4j
public abstract class ObjectPool<T> {private final Deque<T> available = new ArrayDeque<>();private final Deque<T> using = new ArrayDeque<>();/*** 创建一个对象*/protected abstract T create();/*** 从池中获取一个对象*/public synchronized T checkOut() {if (available.isEmpty()) {T obj = this.create();using.addLast(obj);return obj;}T obj = available.poll();using.addLast(obj);return obj;}/*** 将对象放回池中*/public synchronized void checkIn(T t) {using.remove(t);available.addLast(t);}public void printPoolInfo() {log.info("available: {}, using: {}", available.size(), using.size());}
}
@Slf4j
public class Oliphaunt {// 这里类中定义一个序号,用来区分不同的实例private final Integer sno;public Oliphaunt(Integer sno) {this.sno = sno;}public void doSomething() {log.info("sno: {}, do something", this.sno);}
}
public class OliphauntObjectPool extends ObjectPool<Oliphaunt> {private final AtomicInteger count = new AtomicInteger(1);@Overridepublic Oliphaunt create() {return new Oliphaunt(count.getAndIncrement());}}

测试对象池的使用

public class Main {public static void main(String[] args) {ObjectPool<Oliphaunt> oliphauntObjectPool = new OliphauntObjectPool();Oliphaunt oliphaunt = oliphauntObjectPool.checkOut();Oliphaunt oliphaunt2 = oliphauntObjectPool.checkOut();oliphaunt.doSomething();oliphaunt2.doSomething();oliphauntObjectPool.checkIn(oliphaunt);oliphauntObjectPool.checkIn(oliphaunt2);Oliphaunt oliphaunt3 = oliphauntObjectPool.checkOut();oliphaunt3.doSomething();oliphauntObjectPool.printPoolInfo();}
}

输出结果

org.depsea.design.pattern.creation.objectpool.Oliphaunt -- sno: 1, do something
org.depsea.design.pattern.creation.objectpool.Oliphaunt -- sno: 2, do something
org.depsea.design.pattern.creation.objectpool.Oliphaunt -- sno: 1, do something
org.depsea.design.pattern.creation.objectpool.ObjectPool -- available: 1, using: 1

存在的问题

以上实现有一个使用起来不太方便的地方,每次使用完后都需要通过对象池的 checkIn 方法归还对象。但是我们在使用连接池获取连接,使用完毕后好像并没有这个操作,而是直接调用连接的 close 方法即可。这是如何实现的呢?这里提供一个思路。

使Oliphaut实现Closeable并提供一个关闭函数close,并在 Oliphaunt 中提供一个钩子函数,用于在Oliphaunt创建时,创建者可以注入一个钩子,这个钩子函数的目的就是将对象返还到连接池中。然后Oliphaut在关闭函数中调用这个钩子,就可以达到回收对象的目的。

我们需要对 OliphautOliphauntObjectPool 稍加改造。

@Slf4j
public class Oliphaunt implements Closeable {// 这里类中定义一个序号,用来区分不同的实例private final Integer sno;@Sette

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

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

相关文章

MasterAlign背光贴合视觉应用软件说明书

今天为大家介绍下MasterAlign视觉软件在背光贴合行业中该如何使用

HTML好玩代码合集(2)

这一期HTML好玩代码合集是动态烟花文字,是本期里最好玩的一个HTML代码(把文字可以改成表白的),先看效果: 这个效果是动态的,那些数字都是有烟花堆积成的,代码在哪里呢? 在这里: <!DOCTYPE html> <html lang="en"> <script>var _hmt = _…

QT day3 作业2.22

思维导图&#xff1a; 作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到…

Code Composer Studio (CCS) - Build All

Code Composer Studio [CCS] - Build All 1. Build AllReferences 1. Build All Project -> Build All (Ctrl B) References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

保护你的Web应用——CSRF攻击与防御

在Web应用开发过程中&#xff0c;保护用户的隐私和安全至关重要。而CSRF&#xff08;Cross-Site Request Forgery&#xff0c;跨站请求伪造&#xff09;攻击是一种常见的安全威胁&#xff0c;通过利用受信任用户的身份进行恶意操作&#xff0c;威胁到用户的账户和数据安全。本文…

七、计算机视觉-图像的ROI区域

文章目录 1、什么是ROI2、ROI如何实现的3、一个案例总结 1、什么是ROI 在计算机视觉中&#xff0c;ROI代表感兴趣区域&#xff08;Region of Interest&#xff09;&#xff0c;它是指图像或视频中被指定为需要特别关注或处理的区域。ROI可以帮助减少计算量&#xff0c;并且在处…

什么是HTTP代理,socks5代理?它们的区别是什么?

什么是HTTP代理&#xff1f; HTTP代理是一种常见的网络代理方式&#xff0c;它通过在客户端和服务器之间建立一个中间层&#xff0c;将客户端的请求转发给服务器&#xff0c;并将服务器的响应返回给客户端。HTTP代理通常用于访问受限制的网站&#xff0c;或者在网络中隐藏客户…

消息中间件之RocketMQ源码分析(十三)

Broker消息存储机制 RocketMQ首先将消息数据写入操作系统PageCache&#xff0c;然后定时将数据刷入磁盘。接下来主要分析RocketMQ是如何接收发送消息请求并将消息写入PageCache的&#xff0c;整个过程如图 Commit目录下有多个CommitLog文件&#xff0c;其实CommitLog只有一个…

并发编程(2)基础篇-管程

4 共享模型之管程 本章内容 共享问题synchronized线程安全分析Monitorwait/notify线程状态转换活跃性Lock 4.1 共享带来的问题 4.1.1 小故事 老王&#xff08;操作系统&#xff09;有一个功能强大的算盘&#xff08;CPU&#xff09;&#xff0c;现在想把它租出去&#xff…

01 Linux简介

Linux背景 发展史 linux从哪来的&#xff1f;怎么发展的&#xff1f;得从UNIX说起 1968年&#xff0c;一些来自通用电气公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念1969-1970年&am…

【GPTs分享】每日GPTs分享之Canva

简介 Canva&#xff0c;旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片&#xff0c;Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成&#xff1a;根据用户的描述和创意需求&#xff0c;生成定制的设…

基于springboot+vue的教学资源库系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…