设计模式-对象池模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 对象池模式和工厂模式的区别
    • 代码示例
      • Java实现对象池模式
      • Python实现对象池模式
    • 对象池模式在spring中的应用


模式介绍

对象池模式是一种创建型设计模式,它将对象预先创建并初始化后放入一个池中,以供其他对象使用。这种模式的主要目的是减少频繁创建和销毁对象所占用的内存空间和初始化时间。

一个对象池包含一组已经初始化并且可以使用的对象。当某个对象需要使用这些对象时,可以从池中获取一个对象,对其进行操作处理,并在使用完毕后将该对象归还给池子,而不是直接销毁。这样可以避免频繁地创建和销毁对象,提高内存管理效率。

总之,对象池模式通过预先创建和初始化对象并放入池中,使得其他对象可以重复使用这些对象,提高了内存管理效率,减少了对象的创建和销毁开销。

在这里插入图片描述

模式特点

  • 对象池模式的优点主要包括以下几点:
  1. 复用池中对象,没有分配内存和创建堆中对象的开销,没有释放内存和销毁堆中对象的开销,进而减少垃圾收集器的负担,避免内存抖动。
  2. 不必重复初始化对象状态,对于比较耗时的constructor和finalize来说非常合适。
  3. 可以避免频繁地创建和销毁对象,提高内存管理效率。
  4. 可以更好地管理和控制对象的数量,例如线程池或数据库连接池。
  • 然而,对象池模式也存在一些缺点:
  1. 增加了分配/释放对象的开销。
  2. 在并发环境中,多个线程可能同时需要获取池中对象,需要在堆数据结构上进行同步或因为锁竞争而产生阻塞,这种开销要比创建销毁对象的开销高数百倍。
  3. 由于池中对象的数量有限,势必成为一个可伸缩性瓶颈。
  4. 很难正确地设定对象池的大小,如果太小则起不到作用,如果过大,则占用内存资源高。

因此,使用对象池模式时需要根据具体情况权衡利弊,并根据应用场景选择合适的实现方式。

在这里插入图片描述

应用场景

对象池模式主要适用于以下应用场景:

  1. 资源受限的场景 :在不需要可伸缩性的环境(如CPU、内存等物理资源有限)中,如果CPU性能不够强劲或内存比较紧张,垃圾收集和内存抖动可能会造成较大影响,需要提高内存管理效率,响应性比吞吐量更为重要。
  2. 创建成本高的对象 :对于那些创建成本高的对象,可以考虑将其池化,以减少创建和销毁对象的开销。
  3. 在内存中数量受限的对象 :对于那些在内存中数量受限的对象,例如线程池或数据库连接池,使用对象池模式可以更好地管理和控制对象的数量。

在这里插入图片描述

对象池模式和工厂模式的区别

对象池模式工厂模式都是常用的设计模式,但它们有不同的应用场景和特点。

对象池模式主要适用于一些创建成本较高的对象,比如数据库连接、线程池等。在创建这些对象时,需要进行一些繁琐的初始化操作,并且创建和销毁的成本较高。通过使用对象池,我们可以重复利用这些对象,避免浪费资源,提高系统性能。

而工厂模式主要适用于需要创建不同类型对象的场景。当一个类需要创建某个类型的对象时,可以调用工厂方法来创建对象,而不是直接使用new关键字创建对象。这样可以提高代码的灵活性和可维护性,因为如果需要改变对象的创建方式,只需要修改工厂方法的实现即可,而不需要修改使用new关键字创建对象的代码。

对象池模式和工厂模式都可以提高系统性能和可伸缩性,但它们的应用场景和特点不同。在实际应用中,可以根据具体需求选择合适的设计模式。

在这里插入图片描述

代码示例

Java实现对象池模式

下面是一个简单的Java实现对象池模式的示例:

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;public class ObjectPool<T> {private final int maxPoolSize;private final BlockingQueue<T> pool;public ObjectPool(int maxPoolSize) {this.maxPoolSize = maxPoolSize;this.pool = new LinkedBlockingQueue<>(maxPoolSize);}public synchronized T acquire() throws InterruptedException {while (pool.isEmpty()) {if (pool.size() < maxPoolSize) {T newObj = createObject(); // 创建对象的方法,可以根据需要自定义pool.add(newObj); // 添加新对象到池中} else {wait(); // 等待对象可用}}return pool.take(); // 从池中获取对象}public synchronized void release(T obj) {if (pool.size() < maxPoolSize) {pool.add(obj); // 将对象放回池中notifyAll(); // 唤醒等待的线程} else {destroyObject(obj); // 销毁对象的方法,可以根据需要自定义}}private T createObject() {// 创建对象的逻辑,可以根据需要自定义return null;}private void destroyObject(T obj) {// 销毁对象的逻辑,可以根据需要自定义}
}

使用示例:

public class Main {public static void main(String[] args) throws InterruptedException {ObjectPool<MyObject> pool = new ObjectPool<>(5); // 创建一个最大容量为5的对象池for (int i = 0; i < 10; i++) {MyThread thread = new MyThread(pool); // 使用对象池的线程类MyThread进行任务处理thread.start(); // 启动线程进行任务处理}}
}

Python实现对象池模式

下面是一个Python实现对象池模式的示例:

import threadingclass ObjectPool:def __init__(self, max_pool_size):self.max_pool_size = max_pool_sizeself.pool = []self.lock = threading.Lock()def acquire(self):with self.lock:while len(self.pool) == 0:if len(self.pool) < self.max_pool_size:new_obj = self.create_object()self.pool.append(new_obj)else:threading.Condition(self.lock).wait()obj = self.pool.pop(0)return objdef release(self, obj):with self.lock:if len(self.pool) < self.max_pool_size:self.pool.append(obj)threading.Condition(self.lock).notify()else:self.destroy_object(obj)def create_object(self):# 创建对象的逻辑,可以根据需要自定义return Nonedef destroy_object(self, obj):# 销毁对象的逻辑,可以根据需要自定义pass

使用示例:

if __name__ == '__main__':pool = ObjectPool(5) # 创建一个最大容量为5的对象池for i in range(10):thread = MyThread(pool) # 使用对象池的线程类MyThread进行任务处理thread.start() # 启动线程进行任务处理

在这里插入图片描述

对象池模式在spring中的应用

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

具体来说,Spring中的对象池设计模式主要用于在一个池中保存特定数量的对象,并根据需要重新使用。通过这种方式,可以改善使用巨型对象的响应时间。巨型对象指的是那些构造需要很多时间的对象,例如持有数据库连接的对象。最好重用已经存在的和未获取的对象,而不是创建新对象。

在Spring中,数据库连接池不是由Spring直接实现的,而是适用于Spring工作方式的连接池,例如C3P0或Jakarta Commons DBCP连接池。这些连接池作为组件被使用时,会从池中借出对象,用它来完成一些任务并当任务完成时归还该对象。被归还的对象接着满足请求,不管是同一个组件还是其他组件的请求。

Spring中的对象池模式主要是通过集成第三方库来使用和管理对象池,以提高系统的性能和响应时间。

在这里插入图片描述

设计模式-适配器模式

设计模式-工厂模式

设计模式-代理模式

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

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

相关文章

IDEA 2022.2 安装教程

1.下载2020.3版本IDEA 链接&#xff1a;https://pan.baidu.com/s/1IFK8VRjT7vM2VM75ToveGQ?pwd176m 提取码&#xff1a;176m 2.安装 下载完成后&#xff0c;双击exe安装包&#xff0c;出现IDEA安装欢迎首页&#xff1a; 3.将 ja - netfiltet 文件复制到idea安装目录附件 …

云上攻防--云服务对象存储(域名接管)弹性计算(元数据泄露)

云上攻防–云服务&&对象存储(域名接管)&&弹性计算(元数据泄露) 目录标题 云上攻防--云服务&&对象存储(域名接管)&&弹性计算(元数据泄露)对象存储权限配置错误域名接管AK/SK泄漏&#xff1a; 弹性计算元数据泄露加固措施 对象存储 各个厂商对于…

纯CSS实现马里奥效果,回忆一下童年吧

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

竞赛保研 基于大数据的股票量化分析与股价预测系统

文章目录 0 前言1 课题背景2 实现效果3 设计原理QTChartsarma模型预测K-means聚类算法算法实现关键问题说明 4 部分核心代码5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的股票量化分析与股价预测系统 该项目较为新颖…

【每日一题】LeetCode206.反转链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1示例2示例3提示 2. 思路3.代码 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1…

【笔记】Spring的事务是如何回滚的/Spring的事务管理是如何实现的

Spring的事务是如何回滚的/Spring的事务管理是如何实现的 数据库&#xff08;Spring事务&#xff09; 1、建立连接、开启事务&#xff08;准备工作&#xff09; 2、进行sql操作&#xff08;业务逻辑&#xff09; 3、执行成功&#xff0c;则commit&#xff1b; 执行失败&#x…

spellman高压发生器电源维修XRV450PN4500 NY1059

Spellman高压电源X射线发生器维修XRV系列常见维修型号&#xff1a;XRV160N1800, XRV160N3000, XRV160P4000, XRV160P6000/208V 3o, XRV225N3000, XRV225N6000/208V 3o, XRV225P4000, XRV350PN4500, XRV450PN4500。 Spellman所拥有的变频器架构可以使高压电源获得高利用率的效率…

为什么设计制造行业需要数据加密?

设计制造行业是一个涉及多种技术、工艺、材料和产品的广泛领域&#xff0c;它对经济和社会的发展有着重要的影响。然而&#xff0c;随着数字化、智能化和网络化的发展&#xff0c;设计制造行业也面临着越来越多的数据安全风险&#xff0c;如数据泄露、数据篡改、数据窃取等。这…

TSINGSEE青犀智能分析网关V4人体行为检测算法在视频监控中的应用

旭帆科技智能分析网关的算法十分繁多&#xff0c;其中可分为人体事件、车辆事件、环境事件、行为检测、着装检测等等&#xff0c;可覆盖绝大多数场景&#xff0c;如智慧校园、智慧工地、智慧景区等&#xff0c;今天小编就TSINGSEE青犀智能分析网关的行为检测算法和大家进行研讨…

Python 为UnityAndroid端自动化接入Tradplus广告SDK

Python 为UnityAndroid端自动化接入Tradplus广告SDK Tradplus介绍常规接入进入Android开发文档选择渠道配置生成接入代码人工依赖下载官网同版本的 Unity插件 使用自动化工具接入首次 你需要打两个标记来定位运行工具 控制台会列出最新的十个Tradplus版本 任选其一然后拖入项目…

如何利用PPT绘图并导出清晰图片

在写论文的过程中&#xff0c;免不了需要绘图&#xff0c;但是visio等软件绘图没有在ppt上绘图比较熟练&#xff0c;尤其流程图结构图. 但是ppt导出的图片也不够清晰&#xff0c;默认分辨率是96dpi&#xff0c;而杂志投稿一般要求至300dpi。解决办法如下&#xff1a; 1.打开注…

【Azure 架构师学习笔记】- Azure Databricks (4) - 使用Azure Key Vault 管理ADB Secret

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (3) - 再次认识DataBricks 前言 Azure Databricks有access token&#xff0c;是具有ADB内部最高权限的token。在云环境中这些高级别权限的sec…

Kubernetes弃用Dockershim,转向Containerd:影响及如何应对

Kubernetes1.24 版本发布时&#xff0c;正式宣布弃用 Dockershim&#xff0c;转向 Containerd 作为默认的容器运行环境。Kubernetes 以 CRI(Container Runtime Interface) 容器运行时接口制定接入准则&#xff0c;用户可以使用 Containerd、CRI-O、CRI- Dockerd 及其他容器运行…

DDC和PLC的区别

前言 PLC与DDC控制器的比较&#xff0c;一直以来在相关领域内受到广泛关注。每个人站在不同的角度分析&#xff0c;都会有不同的结论&#xff0c;我们今天聊聊这个话题。 基本定义和功能 可编程控制器PLC与直接数字控制器DDC&#xff0c;两者都由CPU模块、I/O模块、显示模块…

工业智能网关:plc数据采集对接mes系统

在工业自动化领域&#xff0c;制造执行系统&#xff08;MES&#xff09;与可编程逻辑控制器&#xff08;PLC&#xff09;之间的实时通信对于提高生产效率、确保产品质量和实现智能化生产至关重要。工业智能网关作为连接两者的关键设备&#xff0c;正在发挥着越来越重要的作用。…

DDAE: Denoising Diffusion Autoencoders are Unified Self-supervised Learners

DDAE: Denoising Diffusion Autoencoders are Unified Self-supervised Learners Paper&#xff1a;https://arxiv.org/abs/2303.09769 Code&#xff1a;https://github.com/FutureXiang/ddae TL; DR&#xff1a;扩散模型的训练其实就是训练一个去噪模型&#xff0c;考虑到类似…

浅了解一下『微前端』

1 什么是微前端 微前端的核心理念是将前端应用程序看作是一个整体&#xff0c;由多个独立的部分组成。每个部分被视为一个微前端应用&#xff0c;它们可以具有自己的技术栈、开发流程和团队组织。这种方式使得团队可以独立开发和部署各个子应用&#xff0c;减少了协调和合并的…

析构和友元函数

1. 类的析构函数 析构函数的作用&#xff0c;用于释放该类所占用的资源&#xff08;或者说释放对象&#xff09;在类的对象使用完时&#xff08;当类的对象超出了作用域&#xff09;&#xff0c;会自动调用析构函数&#xff1b;如果是在堆区实例化的对象&#xff0c;那么当手动…

二分查找——OJ题(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、二分查找1、题目讲解2、算法原理3、代码实现 二、在排序数组中查找元素的第一个和最后一个…

Mini MyBatis-Plus(下)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 最核心的内容前两篇已经…