Singleton模式

Singleton模式的特点:

 

 

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

 

一、指针实现方式

  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》一书中给出的。

  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.cpp
GameSoundMgr& GameSoundMgr::GetInstance() 
{ 
    static GameSoundMgr tGameSoundMgr; 
    return tGameSoundMgr; 
} 

其优缺点列举如下:

 

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

 

三、Singleton Holder

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

  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的小

posted on 2014-10-24 17:07  strangeman  阅读(250)  评论(0编辑  收藏  举报

导航