PoolManger模式

1、背景

    在实际的软件开发中,存在一些宝贵的资源,如内存、线程、数据库的连接,而这些资源的使用在空间或者时间上对软件系统的性能、有时候我们在软件开发中需要不断的申请内存资源或者数据库链接,往往创建这些资源会占用整个操作的很大一部分时间,并且有时候会造成系统内存碎片等系统性能问题。为了提高系统的性能和稳定性,可以在使用前预先创建一部分资源,在使用的过程中将这些资源统一管理,在需要是进行申请分配,使用完之后归还系统,等后续操作的时候进行复用。

    在创建和在创建对象比较昂贵,或者对于特定类型能够创建的对象数目有限制时,管理对象的重用,提高系统时间和空间上的效率。

2 实现:

当client需要使用对象资源的时候,通过PoolManger 对象的方法acquiredReusable()获取具体的对象资源Reusable,如果申请是资源池为空,则创建一个资源对象Reusable,否则等待资源对象Reusable被释放。当使用完资源之后通过releaseReusable()方法将资源归还给PoolManger 对象。

3、UML类图:

4、code实现

1)Reusable为需要复用资源的类  。

  如下为简单的的一个sample,仅仅是为了进行演示PoolManger模式     

#include<iostream>
class Reusable
{
private:
	int m_index;
public:
	Reusable(int index)
	{
		m_index = index;
        }
         void PrinterIndex()
	{
		std::cout<<"index ="<<m_index<<std::endl;
	}
};

2)PoolManger  为资源管理的类

   避免使用中创建多个实例,通过单例模式来获取管理类,保证对象的唯一性。

#include <iostream>
#include<string>
#include<stdio.h>
#include<list>
#include"Reusable.h"
class PoolManger
{
private:
    static PoolManger* m_PInstance;
	int m_maxsize;
	int m_index;
	std::list<Reusable*> m_ObjectPool;
	PoolManger()
	{
      m_maxsize = 0;
	  m_index = 0;
	}
public:

	~PoolManger()
	{
		int i = 0;
		std::list<Reusable*>::iterator ite = m_ObjectPool.begin();
		while(ite != m_ObjectPool.end())
		{
			delete (*ite);
			--m_maxsize;
		}
	}
	Reusable* acquireReusable()
	{
		Reusable* pReusable = NULL;
		if(m_ObjectPool.empty() )
		{
			if(m_index >m_maxsize)
				return NULL;
			m_index ++;
			return new Reusable(m_index);
		}
		else
		{
			pReusable = m_ObjectPool.front();
			m_ObjectPool.pop_front();
			return pReusable;
		}

	}
	static PoolManger* getInstance()  // get singleton
	{
		if( m_PInstance == NULL)
			m_PInstance = new PoolManger;
       		std::cout<<"creat instance"<<std::endl;
		return m_PInstance;
	}
	void releaseReusable(Reusable* Reusable)
	{
		m_ObjectPool.push_back(Reusable);
	}
	void setMaxPoolSize(int max_size)
	{
		m_maxsize = max_size;
	}
};


可以通过PoolManger来统一管理资源对象的分配和创建,这样一方面可以提高资源对象的使用率,另一方面也会避免由于重复创建导致时间和空间的性能问题。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值