设计模式-对象池模式

设计模式专栏

    • 模式介绍
    • 模式特点
    • 应用场景
    • 对象池模式和工厂模式的区别
    • 代码示例
      • 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 threading

class ObjectPool:
    def __init__(self, max_pool_size):
        self.max_pool_size = max_pool_size
        self.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 obj

    def 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 None

    def 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中的对象池模式主要是通过集成第三方库来使用和管理对象池,以提高系统的性能和响应时间。

在这里插入图片描述

设计模式-适配器模式

设计模式-工厂模式

设计模式-代理模式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于Unity使用图片字体示例

1.使用TexturePacker打包图集 下载地址 TexturePacker - Create Sprite Sheets for your game! 2.准备好数字图 3. 导入图片 4. 打包图集需要的设置 将重心点设置为左下方 点击回车 > 后点击回 >到精灵列表 选择导出的格式 导出后的内容 >导入unity 导入 >…

Linux Debian12安装和使用ImageMagick图像处理工具 常见图片png、jpg格式转webp格式

一、ImageMagick简介 ImageMagick是一套功能强大、稳定而且免费的工具集和开发包。可以用来读、写和图像格式转换&#xff0c;可以处理超过100种图像格式&#xff0c;包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式。对图片的操作&#xff0c;即可以通过命令行进行&am…

利用全面预算管理,构建企业数智化管理体系

财务团队对于一个企业的发展来说一直承担着巨大的压力&#xff0c;特别是当今的经济世态&#xff0c;财务管理被赋予比以往任何时候更高的期望。为了提高运营效率&#xff0c;降低管理成本&#xff0c;企业朝着数智化的方向逐渐靠拢。其中&#xff0c;全面预算管理的潜在价值是…

【C++】vector 基本使用(详解)

目录 一&#xff0c;vector 的介绍 二&#xff0c;vector 的定义 1&#xff0c;vector() 2&#xff0c;vector&#xff08;size_type n, const value_type& val value_type()&#xff09; 3&#xff0c;vector (const vector& x) 4&#xff0c;vector (InputIte…

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安装目录附件 …

Tailwind CSS 在Html中的使用

官网地址&#xff1a;Installation - Tailwind CSS 前言 记录从0到1在原生HTML中通过Tailwind CLI 使用Tailwind CSS Tailwind CLI 第一步&#xff0c;新建一个HTML文件夹 mkdir HTML 第二步&#xff0c;安装依赖tailwindcSS npm install -D tailwindcss 第三步&#xf…

SpringSercurity踩坑之request.getRequestURI()和request.getRequestURL()

今天在开发的时候遇到一个小小的问题&#xff0c;我在swagger测试权限的时候&#xff0c;直接跳过了放开的路径&#xff0c;直接进行了角色判断&#xff0c; .addFilterBefore(new TokenAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 在这里if判断路径…

园林机械部件自动化三维测量检测形位公差-CASAIM自动化三维检测工作站

随着园林机械的广泛应用&#xff0c;对其机械部件的精确测量需求也日益增加。传统的测量方法不仅效率低下&#xff0c;而且精度难以保证&#xff0c;因此&#xff0c;自动化三维测量技术成为了解决这一问题的有效途径。本文将重点介绍CASAIM自动化三维检测工作站在园林机械部件…

mysql查询出json格式字段中的值

一、使用场景 由于一些特殊数据使用json格式保存到表数据种中了&#xff0c;在查询的时候需要查询出这条数据中json格式中的某个字段 比如&#xff1a;需要将下列字符串中的“nationality”字段单独查询出来 json格式是一个对象 结果&#xff1a; json格式是一个集合 查询结…

HarmonyOS云开发基础认证【题库答案】

HarmonyOS应用开发者基础认证【题库答案】 HarmonyOS应用开发者高级认证【题库答案】 一、判断题 应用架构的演进依次经历了微服务架构、单体架构、Serverless架构等阶段。&#xff08;错&#xff09;鸿蒙应用可以使用Arkts开发&#xff08;对&#xff09;认证服务在绑定微信账…

odoo17核心概念view5——ir_ui_view.py

这是view系列的第5篇文章&#xff0c;介绍一下view对应的后端文件ir_ui_view.py&#xff0c;它是base模块下的一个文件 位置&#xff1a;odoo\addons\base\models\ir_ui_view.py 该文件一共定义了三个模型 1.1 ir.ui.view.custom 查询数据库这个表是空的&#xff0c;从名字看…

spring security oauth2搭建认证服务器

如图&#xff08;上面图片的代码在业务项目中&#xff09;&#xff0c;第一步在独立的业务项目中&#xff0c;先获取授权码&#xff08;也叫jsessionId&#xff09;、获取授权码的路径就是 /oauth2/authorize&#xff0c;这个路径是oauth2的框架中被OAuth2AuthorizationEndpoin…

『JavaScript』全面解析JavaScript中的防抖与节流技术及其应用场景

&#x1f4e3;读完这篇文章里你能收获到 理解防抖&#xff08;Debouncing&#xff09;和节流&#xff08;Throttling&#xff09;的概念&#xff1a;了解这两种性能优化技术如何帮助我们更有效地处理频繁触发的事件掌握防抖与节流的实现方法&#xff1a;学习如何在JavaScript中…

【XR806开发板试用】XR806串口驱动CM32M对小厨宝的控制实验

一.说明 非常感谢基于安谋科技STAR-MC1的全志XR806 Wi-FiBLE开源鸿蒙开发板试用活动,并获得开发板试用。 XR806是全志科技旗下子公司广州芯之联研发设计的一款支持WiFi和BLE的高集成度无线MCU芯片&#xff0c;支持OpenHarmony minisystem和FreeRTOS&#xff0c;具有集成度高、…

岁末年终,收下谷歌开发者账号专属资料包

行至年末&#xff0c;感谢大家这一年对 "谷歌开发者" 的关注和支持&#xff0c;我们特在年终为大家梳理了资料包&#xff0c;帮助您做好整年知识点总结&#xff0c;精进开发技能&#xff0c;以更加从容的姿态迎接来年新光。 文章资料 我们一如既往地专注于为开发者们…

76 Python开发-内外网收集Socket子域名DNS

目录 Python开发相关知识点本篇文章涉及知识点演示案例:IP&Whois&系统指纹获取代码段-外网CDN&子域名&端口扫描&交互代码段-外网IP&计算机名&存活主机&端口扫描代码段-内网Py格式解析环境与可执行程序格式转换-Pyinstaller 涉及资源&#xff1…

L1-069:胎压监测

题目描述 小轿车中有一个系统随时监测四个车轮的胎压&#xff0c;如果四轮胎压不是很平衡&#xff0c;则可能对行车造成严重的影响。 让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序&#xff0c;随时监测四轮的…

【Vue】事件修饰符详解

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

SSL证书过期了怎么办

当SSL证书过期时&#xff0c;您需要尽快采取行动来确保您的网站继续提供安全的加密连接。以下是一些您可以采取的步骤&#xff1a; 更新证书&#xff1a; 尽快向您的SSL证书颁发机构申请并安装一个新的证书。如果您使用的是免费SSL证书&#xff08;比如Lets Encrypt&#xff0…