单件模式是设计模式中最简单,常用的一种模式,但是要真正实现一个简洁,安全的单件模式并不是一件容易的事情,这是我总结的按不同的需求所实现的不同版本的单件模式。
【1】在四人帮的设计模式的这本书上给出了一个最原始简单的版本,这个版本也被许多开发人员视为标准:
class Singleton<?xml:namespace prefix = o />
{
public:
static Singleton * Instance()
{
if( 0== _instance)
{
_instance = new Singleton;
}
return _instance;
}
protected:
Singleton(void)
{
}
virtual ~Singleton(void)
{
}
static Singleton* _instance;
};
但是这个类的实现有很多问题,首先_instance在程序结束是不会自动释放,因此会造成内存的泄露,最简单的补救措施是添加一个共有的Destroy()函数,并在程序结束前调用。
【2】添加内存回收功能。一个完整的Singleton应该在程序退出时自动回收内存,下面是用智能指针实现的带垃圾回收功能的Singleton。
#include "stdafx.h"
#include <iostream>
#include <memory>
using namespace std;
class Singleton
{
public:
static Singleton * Instance()
{
if( 0== _instance.get())
{
_instance.reset( new Singleton);
}
return _instance.get();
}
protected:
Singleton(void)
{
cout <<"Create Singleton"<<endl;
}
virtual ~Singleton(void)
{
cout << "Destroy Singleton"<<endl;
}
friend class auto_ptr<Singleton>;
static auto_ptr<Singleton> _instance;
};
//Singleton.cpp
auto_ptr<Singleton> Singleton::_instance(0);
#include <iostream>
#include <memory>
using namespace std;
class Singleton
{
public:
static Singleton * Instance()
{
if( 0== _instance.get())
{
_instance.reset( new Singleton);
}
return _instance.get();
}
protected:
Singleton(void)
{
cout <<"Create Singleton"<<endl;
}
virtual ~Singleton(void)
{
cout << "Destroy Singleton"<<endl;
}
friend class auto_ptr<Singleton>;
static auto_ptr<Singleton> _instance;
};
//Singleton.cpp
auto_ptr<Singleton> Singleton::_instance(0);
int _tmain(int argc, _TCHAR* argv[])
{
{
Singleton * pInstance = Singleton::Instance();
return 0;
}
return 0;
}
【3】如果一个工程里要使用多个单件模式,则可以定义单件的模板形式。
template <typename T> class Singleton
{
protected:
{
protected:
static T* ms_Singleton;
public:
Singleton( void )
{
assert( !ms_Singleton );
}
~Singleton( void )
{
assert( ms_Singleton );
ms_Singleton = 0;
}
static T& getSingleton( void )
{
assert( ms_Singleton );
return ( *ms_Singleton );
}
static T* getSingletonPtr( void )
{
return ms_Singleton;
}
};
Singleton( void )
{
assert( !ms_Singleton );
}
~Singleton( void )
{
assert( ms_Singleton );
ms_Singleton = 0;
}
static T& getSingleton( void )
{
assert( ms_Singleton );
return ( *ms_Singleton );
}
static T* getSingletonPtr( void )
{
return ms_Singleton;
}
};
class ControllerManager : public Singleton<ControllerManager>
{
static ControllerManager& getSingleton(void);
static ControllerManager* getSingletonPtr(void);
};
{
static ControllerManager& getSingleton(void);
static ControllerManager* getSingletonPtr(void);
};
template<> ControllerManager* Singleton<ControllerManager>::ms_Singleton = 0;
ControllerManager* ControllerManager::getSingletonPtr(void)
{
return ms_Singleton;
}
ControllerManager& ControllerManager::getSingleton(void)
{
return ( *ms_Singleton );
}
ControllerManager* ControllerManager::getSingletonPtr(void)
{
return ms_Singleton;
}
ControllerManager& ControllerManager::getSingleton(void)
{
return ( *ms_Singleton );
}
转载于:https://blog.51cto.com/zyh2000/327650