PoolManger模式

来源:互联网 发布:c语言顺序表的就地逆置 编辑:程序博客网 时间:2024/05/18 01:07

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