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