单实例大家都会使用,这里介绍的是能够自动释放资源的单实例模式:
单实例基类:
// SingleInstanceBase.h
#include <map>
#include <memory>
using namespace std;
#define _MACRO_SINGLETON_(A) A* SingleInstanceBase<A>::s_SingleInstance = NULL;\
static std::auto_ptr<A> _Singleton(A::getSingletonPtr());
template <typename T>
class SingleInstanceBase
{
protected:
static T* s_SingleInstance;
// static std::auto_ptr<T> s_SingleInstance;
public:
SingleInstanceBase( void )
{
s_SingleInstance = static_cast<T*>(this);
}
virtual ~SingleInstanceBase( void )
{
s_SingleInstance = NULL;
}
static T& getSingleton( void )
{
if( NULL == s_SingleInstance )
new T;
return ( *s_SingleInstance );
}
static T* getSingletonPtr( void )
{
if( NULL == s_SingleInstance )
new T;
return ( s_SingleInstance );
}
private:
SingleInstanceBase& operator=(const SingleInstanceBase&)
{
return *this;
}
SingleInstanceBase(const SingleInstanceBase&) {}
};
应用实例:
// CClassA.h
class CClassA : public SingleInstanceBase<CClassA>
{
public:
void method();
......
}
_MACRO_SINGLETON_(CClassA) // 此处是对单实例类的初始化
CClassA::CClassA()
{
...
}
CClassA::~CClassA()
{
...
}
void CClassA::method()
{
::MessageBox(NULL, "调用方法method", "提示", MB_OK);
}
CClassA调用方法method示例:
CClassA::getSingletonPtr()->method();