对象池模式

一、对象池模式

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");
	}
}

在这里插入图片描述

– 求知若饥,虚心若愚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值