单件模式Singleton用法之扩展

单件模式是设计模式中最简单,常用的一种模式,但是要真正实现一个简洁,安全的单件模式并不是一件容易的事情,这是我总结的按不同的需求所实现的不同版本的单件模式。
【1】在四人帮的设计模式的这本书上给出了一个最原始简单的版本,这个版本也被许多开发人员视为标准:
class Singleton
{
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);
int _tmain(int argc, _TCHAR* argv[])
{
 Singleton * pInstance = Singleton::Instance();
 return 0;
}
 
【3】如果一个工程里要使用多个单件模式,则可以定义单件的模板形式。
template <typename T> class Singleton
{
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;
 }
};
class ControllerManager : public Singleton<ControllerManager>
{
 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 ); 
}
 

你可能感兴趣的:(模式,Singleton,单件,用法,休闲)