首页 > 代码库 > Singleton模式

Singleton模式

Singleton模式的特点:

 

 

  • 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
    • 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作(C++中的一个静态成员函数)。
  • 和全局变量相比:
    • 编译器不保证全局变量的初始化顺序;
    • 全局变量不能防止实例化多个对象。

 

一、指针实现方式

[cpp] view plaincopyprint?
  1. //Singleton.h  
  2. class Singleton  
  3. {  
  4. public:  
  5.     static Singleton* Instance(); 
  6. protected:  
  7.     Singleton(); 
  8. private:  
  9.     static Singleton* _instance;  
  10. }; 
  11.  
  12.  
  13. //Singleton.cpp  
  14. Singleton* Singleton::_instance = 0; 
  15. Singleton::Singleton()  
  16. {  
  17.     cout << "Singleton...." << endl;  
  18. Singleton* Singleton::Instance()  
  19. {  
  20.     if (_instance == 0)  
  21.     {  
  22.         _instance = new Singleton();  
  23.     } 
  24.     return _instance;  
  25. }  
  26.  
  27.  
  28. //main.cpp  
  29. #include "Singleton.h" 
  30. int main()  
  31. {  
  32.     Singleton* sgn = Singleton::Instance(); 
  33.     //sgn->...  
  34. }  
//Singleton.h class Singleton { public:     static Singleton* Instance();protected:     Singleton();private:     static Singleton* _instance; };//Singleton.cpp Singleton* Singleton::_instance = 0;Singleton::Singleton() {     cout << "Singleton...." << endl; }Singleton* Singleton::Instance() {     if (_instance == 0)     {         _instance = new Singleton();     }    return _instance; } //main.cpp #include "Singleton.h"int main() {     Singleton* sgn = Singleton::Instance();    //sgn->... } 

这是Singleton最常见的一种实现方式。优缺点列举如下:

 

  • 优点
    • 对唯一实例的受控访问
    • 缩小名空间:对全局变量的一种改进,避免了存储唯一实例的全局变量污染名空间。
  • 缺点
    • 返回的是指针,调用者有可能会delete掉
    • Singleton占用的内存,何时会被释放?

 

二、引用实现方式

这种方式是《Modern C++ Design》一书中给出的。

[cpp] view plaincopyprint?
  1. //GameSoundMgr.h  
  2. class GameSoundMgr  
  3. {  
  4. public:  
  5.     static GameSoundMgr& GetInstance();  
  6. protected:  
  7.     GameSoundMgr();  
  8.     GameSoundMgr(const GameSoundMgr&);  
  9.     GameSoundMgr& operator=(const GameSoundMgr&);  
  10.     ~GameSoundMgr();  
  11. };  
  12.  
  13.  
  14. //GameSoundMgr.cpp 
  15. GameSoundMgr& GameSoundMgr::GetInstance()  
  16. {  
  17.     static GameSoundMgr tGameSoundMgr;  
  18.     return tGameSoundMgr;  
  19. }  
//GameSoundMgr.h class GameSoundMgr { public:     static GameSoundMgr& GetInstance(); protected:     GameSoundMgr();     GameSoundMgr(const GameSoundMgr&);     GameSoundMgr& operator=(const GameSoundMgr&);     ~GameSoundMgr(); }; //GameSoundMgr.cppGameSoundMgr& GameSoundMgr::GetInstance() {     static GameSoundMgr tGameSoundMgr;     return tGameSoundMgr; } 

其优缺点列举如下:

 

  • 优点
    • 构造/析构函数,拷贝构造函数,赋值函数等,都被限定为私有函数,可防止外部调用生成Singleton的副本
    • 外部得到的是static局部变量的引用,不会删除对象
    • 程序结束后,Singleton内存自动释放
  • 缺点
    • 即使不使用此Singleton,静态变量始终存在

 

三、Singleton Holder

在你的系统中,有可能要用到多个Singleton对象,比如一个国家,主席只能有一个,同样,国防部长也只能有一个,那怎么办呢?《Modern C++ Design》还给我们提供了一种Singleton Holder,通过template的应用,批量生产Singleton。

[cpp] view plaincopyprint?
  1. //SingletonHolder.h  
  2. template<class MyClass>  
  3. class SingletoHolder  
  4. {  
  5. public:  
  6.     static MyClass& GetInstance();  
  7. };  
  8.  
  9. //SingletonHolder.cpp  
  10. #include "SingletonHolder.h"  
  11. MyClass& SingletonHolder::GetInstance()  
  12. {  
  13.     static MyClass tMyClass;  
  14.     return tMyClass;  
  15. }  
  16.  
  17. //class GameSoundSystem; 
  18. typedef SingletonHolder<GameSoundSystem> SingleSoundSytem; 
  19. GameSoundSystem& mySoundSys = SingleSoundSytem ::GetInstance(); 
//SingletonHolder.h template<class MyClass> class SingletoHolder { public:     static MyClass& GetInstance(); }; //SingletonHolder.cpp #include "SingletonHolder.h" MyClass& SingletonHolder::GetInstance() {     static MyClass tMyClass;     return tMyClass; } //class GameSoundSystem;typedef SingletonHolder<GameSoundSystem> SingleSoundSytem;GameSoundSystem& mySoundSys = SingleSoundSytem ::GetInstance();

以上技术的详情,请参见《Modern C++ Design》一书。另外在我的博客另外一篇文章,也有一个logSingleton的小

Singleton模式