设计模式-对象池模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 对象池模式和工厂模式的区别
    • 代码示例
      • 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://xiahunao.cn/news/2661353.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

ERROR: No matching distribution found for torch==2.0.1解决方案

大家好&#xff0c;我是水滴~~ 本文主要介绍在安装 stable-diffusion-webui 时出现的 ERROR: No matching distribution found for torch2.0.1 问题的解决方案&#xff0c;希望能对你有所帮助。 《Python入门核心技术》专栏总目录・点这里 文章目录 问题描述解决方案离线安装 …

工具篇--Spring-Cloud--feign 通过feign 接口完成文件的下载

文章目录 前言一、feign接口获取文件流程&#xff1a;二、文件获取实现2.1 引入jar&#xff1a;2.2 实现&#xff1a; 总结 前言 通常在spring-boot 项目中&#xff0c;对于文件的下载都是直接调用到对应的服务中&#xff0c;而不是通过feign 接口获取文件&#xff1b;有时我们…

算法练习Day23 (Leetcode/Python-回溯算法)

46. Permutations Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order. Example 1: Input: nums [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路&#xff1a;此题可用回溯…

SpringBoot 项目中常用的注解

每一层对应每个包&#xff0c;包名中应全为小写。 一、Common 层&#xff08;实体类&#xff09; 前提&#xff1a;导入 Lombok 依赖 Data&#xff1a;生成 get 和 set 方法以及 toString 方法 Getter&#xff1a;只生成 get 方法&#xff0c;避免对类中的成员变量修改。 …

中国人事考试网公布多项考试成绩:注安、一造在列

12月29日&#xff0c;中国人事考试网公布多项职业资格考试成绩&#xff0c;包括大家心心念念想的注册安全工程师、一级造价工程师考试成绩&#xff0c;公告发布的今天&#xff0c;考生即可登录中国人事考试网查询考试成绩。 较早发布的是注册安全工程师考试成绩&#xff08;成绩…

鸿蒙开发(二)- 鸿蒙DevEco3.X开发环境搭建

上篇说到&#xff0c;鸿蒙开发目前势头旺盛&#xff0c;头部大厂正在如火如荼地进行着&#xff0c;华为也对外宣称已经跟多个厂商达成合作。目前看来&#xff0c;对于前端或客户端开发人员来说&#xff0c;掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…

信息泄露总结

文章目录 一、备份文件下载1.1 网站源码1.2 bak文件泄露1.3 vim缓存1.4 .DS_Store 二、Git泄露2.1 git知识点2.1 log2.2 stash 三、SVN泄露3.1 SVN简介3.2 SVN的文件3.3 SVN利用 四、Hg泄露 一、备份文件下载 1.1 网站源码 常见的网站源码备份文件后缀&#xff1a; tartar.gz…

2024年医院设备维修培训安排

在你还考虑该不该干的时候别人已经走好远了 小时候觉得忘带作业是天大的事&#xff0c;高中的时候&#xff0c;觉得考不上大学是天大的事&#xff0c;恋爱的时候&#xff0c;觉得跟喜欢的人分开是天大的事&#xff0c;到现在回头看看&#xff0c;那些难以跨过的山&#xff0c;…

ssm基于HTML和JS物资物流系统的设计与实现+vue论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对物资物流信息管理的提升&#x…

切面编程的理解和使用,Java小白入门(五)

我们进入ruoyi-framework,立刻看到的内容 了解一下aspectj 这个概念 概念 面向切面编程&#xff08;AOP&#xff09; 面向切面编程&#xff08;AOP&#xff09;是一种编程范式&#xff0c;重点聚焦于软件应用程序中的关注点分离。AOP 背后的思想是软件应用程序具有多个切面&a…

CSDN,你的服务器挂了

浏览器访问一些文章&#xff0c;访问不到&#xff1a;https://blog.csdn.net/qq_40389276/article/details/99709890

未来编程语言什么样?编译解释兼容方为王

○、编程语言的未来&#xff1f; 随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。那么&#xff0c;在技术不断进步的未来&#xff0c;编程语言的走向又将如何呢&#xff1f; …

基于人类反馈的强化学习(RLHF)

1. 监督微调&#xff08;SFT&#xff09;&#xff1a;为了训练语言模型&#xff08;LM&#xff09;掌握基本的任务执行技能&#xff0c;首先需要构建一个监督数据集。这个数据集包含了指令性的输入提示和期望的输出结果&#xff0c;通过这些数据对LM进行精细调整。为了保证任务…

C#中的Attribute详解(上)

C#中的Attribute详解&#xff08;上&#xff09; 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute&#xff0c;为了区分这四类静态方法&#xff0c;我们只能通过注释来说明&#xff0c;但这样做会给系统带来很多…

突破PHP disable_functions方法

1. 利用 LD_PRELOAD 环境变量 知识扫盲 LD_PRELOAD&#xff1a;是Linux系统的一个环境变量&#xff0c;它指定的*.so文件会在程序本身的*.so文件之前被加载。putenv()&#xff1a;PHP函数&#xff0c;可以设置环境变量mail()&#xff0c;error_log()&#xff1a;PHP函数&…

Python面向对象高级与Python的异常、模块以及包管理

Python面向对象高级与Python的异常、模块以及包管理 一、Python中的继承 1、什么是继承 我们接下来来聊聊Python代码中的“继承”:类是用来描述现实世界中同一组事务的共有特性的抽象模型,但是类也有上下级和范围之分,比如:生物 => 动物 => 哺乳动物 => 灵长型…

模式识别与机器学习-半监督学习

模式识别与机器学习-半监督学习 半监督学习半监督学习的三个假设半监督学习算法自学习算法自学习的步骤&#xff1a;自学习的优缺点&#xff1a;优点&#xff1a;缺点&#xff1a; 协同训练多视角学习生成模型半监督SVM 谨以此博客作为复习期间的记录 半监督学习 半监督学习&…

浅谈安科瑞智能照明系统在马来西亚国家石油公司项目的应用

摘要&#xff1a;随着社会经济的发展及网络技术、通信技术的提高&#xff0c;人们对照明设计提出了新的要求&#xff0c;它不仅要控制照明光源的发光时间、 亮度&#xff0c;而且与其它系统来配合不同的应用场合做出相应的灯光场景。本文介绍了马亚西亚石油公司智能照明项目的应…

大数据前馈神经网络解密:深入理解人工智能的基石

文章目录 大数据前馈神经网络解密&#xff1a;深入理解人工智能的基石一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函…

蓝牙物联网智能安防系统设计方案

1概述 安防系统(安全防护)的作用是预防损失&#xff0c;是人们保障人身和财产安全最重要的工具之一。近年来&#xff0c;伴随经济的飞速发展和城市人口的急剧增加&#xff0c;盗窃、入室抢劫等事件的增多给人们的安定生活带来了很大的影响&#xff0c;同时&#xff0c;交通的快…