对象池模式

news2025/1/11 5:38:31

一、对象池模式

1、定义

对象池模式(Object Pool Pattern)是将对象预先创建并初始化后放入对象池中,对象提供者就能利用已有的对象来处理请求,减少频繁创建对象锁占用的内存空间和初始化时间。属于创建型设计模式。

一个对象池包含一组已经初始化并且可以使用的对象,可以在有需要时创建和销毁对象。

对象池模式就是单例模式加享元模式。

2、结构

1)模式的结构

主要角色如下:

  • 对象池(ObjectPool):持有对象并提供取/还等方法。
  • 抽象池化对象(IPooledObject):对池中对象的抽象。
  • 具体池化对象(ConcretePoolObject):对池中对象的封装,封装对象的状态和一些其他信息。

3、优缺点

优点:

  • 复用池中对象,消除创建对象、回收对象所产生的内存开销、CPU开销等。

缺点:

  • 增加了分配/释放对象的开销。
  • 很难合理设定对象池的大小。
  • 在并发环境中,同步加锁阻塞要比创建对象的开销高数倍。

4、使用场景

  • 资源受限的场景。
  • 在内存中数量受限的对象。
  • 创建成本高的对象,可以考虑池化。

5、在框架源码中使用

  • 常见的使用对象池模式的场景有线程池、数据库连接池等。

二、模式的通用实现

代码如下:

public class ObjectPoolPattern {

	public static void main(String[] args) {
		ObjectPool pool = new ObjectPool(3, 5);

		IPooledObject object1 = pool.borrowObject();
		IPooledObject object2 = pool.borrowObject();
		IPooledObject object3 = pool.borrowObject();
		IPooledObject object4 = pool.borrowObject();
		IPooledObject object5 = pool.borrowObject();
		IPooledObject object6 = pool.borrowObject();

		System.out.print(object1 + " --> ");
		object1.operator();
		System.out.print(object2 + " --> ");
		object2.operator();
		System.out.print(object3 + " --> ");
		object3.operator();
		System.out.print(object4 + " --> ");
		object4.operator();
		System.out.print(object5 + " --> ");
		object5.operator();
		System.out.print(object6 + " --> ");
		object6.operator();

		System.out.println("---------归还-------");
		pool.returnObject(object6);
		IPooledObject object7 = pool.borrowObject();
		System.out.print(object7 + " --> ");
		object7.operator();

	}
}

// 对象池()
class ObjectPool {
	// 当对象不够用时,每次扩容的数量
	private int step = 10;

	private int minCount;
	private int maxCount;

	// 保存未借出的对象
	private Vector<IPooledObject> returned;
	// 保存已经借出的对象
	private Vector<IPooledObject> borrowed;

	public ObjectPool(int minCount, int maxCount) {
		returned = new Vector<>();
		borrowed = new Vector<>();
		this.minCount = minCount;
		this.maxCount = maxCount;

		refresh(this.minCount);
	}

	/**
	 * 初始化一定数量的对象
	 * @param minCount
	 */
	private void refresh(int minCount) {
		for (int i = 0; i < minCount; i++) {
			returned.add(new ConcretePoolObject());
		}
	}

	/**
	 * 借对象
	 * @return
	 */
	public IPooledObject borrowObject(){
		IPooledObject next = null;

		if(returned.size() <=  0){
			int count = maxCount - minCount;
			refresh(count > step ? step : count);
		}

		Iterator<IPooledObject> iterator = returned.iterator();
		while (iterator.hasNext()){
			next = iterator.next();
			returned.remove(next);
			borrowed.add(next);
			break;
		}
		return next;
	}

	public void returnObject(IPooledObject pooledObject){
		returned.add(pooledObject);
		if(borrowed.contains(pooledObject)){
			borrowed.remove(pooledObject);
		}
	}
}

// 抽象池化对象
interface IPooledObject {
	void operator();
}
// 具体池化对象
class ConcretePoolObject implements IPooledObject{
	@Override
	public void operator() {
		System.out.println(" do something");
	}
}

在这里插入图片描述

– 求知若饥,虚心若愚。

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

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

相关文章

python 模板注入

web 程序包括两个文件&#xff1a; flask-test.py 和 Config.py 文件 #!/usr/bin/env python # -*- coding:utf8 -*- import hashlib import logging from datetime import timedelta from flask import Flask from flask import request from flask import config from flask…

基于java(springboot)篮球竞赛预约管理系统(java毕业设计)

基于java(springboot)篮球竞赛预约管理系统 篮球竞赛管理系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;springboot框架和idea工具开发&#xff0c;本系统分为用户和管理员两个角色&#xff0c;其中用户可以在线注册登陆&#xff0c;查看平台公告&#xff0c;查看…

JSP运动会信息网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 模块划分&#xff1a;通知类型、通知信息、裁判信息、运动员信息、项目类型、项目 信息、场地信息、项目安排、报名信息…

【记录】ubuntu20.04安装nvidia显卡驱动

新安装的Ubuntu20.04系统&#xff0c;如果想进行人工智能相关的学习&#xff0c;需要配置一系列的环境&#xff0c;这里我记录下具体的安装过程。 Nvidia显卡驱动的安装 1 安装前需要安装依赖(必须执行) sudo apt-get update #更新软件列表 #安装编译依赖 sudo apt-get inst…

Python urllib CRLF注入漏洞小结

Python urllib CRLF注入漏洞小结 CVE-2016-5699 https://www.suse.com/security/cve/CVE-2016-5699.html before 2.7.10 and 3.x before 3.4.4POC&#xff1a; http://127.0.0.1%0d%0aX-injected:%20header%0d%0ax-leftover:%20:12345/foo漏洞&patch源码&#xff1a;http…

音视频大合集最终篇;学废了

前言 加企鹅群&#xff1a;1079654574 解锁 《音视频八大板块资料》音视频大合集&#xff0c;从初中高到面试应有尽有;让学习更贴近未来实战。已形成PDF版 八个模块内容如下&#xff1a; 1.音视频基础2.FFmpeg实战3.流媒体客户端4.流媒体服务器5.WebRTC项目实战6.Android NDK开…

零时 || 警惕恶意聊天软件!聊天记录被劫持损失数千万资产追踪分析

事件背景 近期&#xff0c;零时科技安全团队收到大量用户因为同一个原因导致加密资产被盗的情况&#xff0c;经调查都是因为过程中使用了恶意Whatsapp的原因&#xff0c;通过与受害者沟通&#xff0c;了解到情况如下&#xff1a; 受害者在使用恶意Whatsapp进行沟通时&#xf…

173. 二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

STM32F4 | PWM输出实验

文章目录一、PWM 简介二、硬件设计三、软件设计四、实验现象五、STM32CubeMX 配置定时器 PWM 输出功能上一章&#xff0c;我们介绍了 STM32F429 的通用定时器 TIM3&#xff0c;用该定时器的中断来控制 DS1 的闪烁&#xff0c;这一章&#xff0c;我们将向大家介绍如何使用 S…

CososCreator (Android)-AppLovin MAX 广告聚合平台接入+Firebase统计

CososCreator 2.2.4 Android Studio &#xff1a;4.2.1 接入SDK有&#xff1a;接max聚合及中介平台(Admob&#xff0c;FB, applovin&#xff0c;pangle&#xff0c;mintegral&#xff0c;vungle&#xff0c;unity)&#xff0c;和Firebase 统计 1、构建Android工程 2、升级gr…

计算机SSM毕设推荐 40个高质量软件工程毕设项目分享【源码+论文】(一)

文章目录前言 题目1 : 基于SSM的毕业设计管理系统 <br /> 题目2 : 基于SSM的病人跟踪治疗信息管理系统 <br /> 题目3 : 基于SSM的大学生兼职跟踪系统 <br /> 题目4 : 基于SSM的大学生企业推荐系统 <br /> 题目5 : 基于SSM的电影院在线售票系统 <br …

电感和磁珠的区别

电感和磁珠在我们电路设计中经常会用到&#xff0c;他们都属于磁性元器件&#xff0c;今天就来分享下电感和磁珠的区别 1.从构成原理来看 电感其实就是导线这样一圈一圈绕在磁芯上&#xff0c;这样就构成了电感&#xff0c;而磁珠(插件)的话则是导线外围包裹着一层铁氧体磁性材…

Linux中磁盘存储相关命令

du 命令 Linux du命令也是查看使用空间的&#xff0c;但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看&#xff0c;还是和df命令有一些区别的. **1&#xff0e;**命令格式&#xff1a; du [选项][文件] **2&#xff0e;**命令功能&#xff1a; 显示每…

javaHelloWorld

java语言介绍 ​ 目前大系统开发中&#xff0c;很少使用单一语言进行开发&#xff0c;现有语言也十分发达&#xff0c;包含Java\C\C\PHP\Python等等。通常情况下&#xff0c;一个大系统底层驱动部分都是使用C语言开发&#xff0c;而在上层用户交互层使用java语言开发。因此&am…

新型材料厂电动葫芦PLC无线通讯应用方案详解

一&#xff0e;应用背景 电动葫芦是一种安装在天车、龙门吊之上的特种起重设备&#xff0c;具有体积小&#xff0c;自重轻&#xff0c;操作简单&#xff0c;使用方便等特点&#xff0c;是起升搬运物品&#xff0c;最理想的起重设备之一。目前电动葫芦的控制部分都是由PLC完成的…

【Spring Cloud】Ribbon负载均衡原理与实战(源码级讲解)

本期目录1. 负载均衡原理1.1 总体流程1.2 源码解析2. 负载均衡策略2.1 负载均衡策略继承关系2.2 负载均衡策略描述1&#xff09;ZoneAvoidanceRule2&#xff09;AvailabilityFilteringRule2.3 修改负载均衡策略方式1&#xff09;全局修改2&#xff09;局部修改3. 饥饿加载3.1 背…

使用VackBAS攻击模拟平台对抗勒索病毒

勒索病毒是一种恶意软件&#xff0c;它可以从一台主机直接感染到整个网络&#xff08;包括服务器&#xff09;并加密磁盘上的任何文件和文档&#xff0c;勒索软件会要求受害者缴纳赎金以取回对电脑的控制权&#xff0c;或取回受害者根本无从自行获取的密钥去解密文件。勒索病毒…

jsp+ssm计算机毕业设计宠物店管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

数论的一些小小的性质总结

gcd的一些套路&#xff1a; 1.设一些未知数&#xff0c;设gcd为k&#xff0c;换个角度去看问题&#xff0c;比如去枚举倍数 2.一堆数的gcd为1&#xff0c;等价于它们所有数的因子重合小于n&#xff1b;两个数的gcd1&#xff0c;它们的因子之间没有重合 3.相邻两数之间gcd1&a…

SpringMVC:SpringMVC请求映射路径(3)

SpringMvc请求路径1. 环境准备2. 问题提出3. 设置映射路径3.1 方法一&#xff1a;修改Controller3.2 方法二&#xff1a;优化路径配置1. 环境准备 项目结构 BookController类 public class BookController {RequestMapping("/save")ResponseBodypublic String save…