Singleton单例模式

 

 

singleton单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

解析:

Singleton模式其实是对全局静态变量的一个取代策略,singleton模式的两个作用在C++中是通过如下的机制实现的:

1)仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对应类的所有对象而言是唯一的

2)提供一个访问他的全局访问点,也就是提供对应的访问这个静态成员变量的静态成员函数,对类的所有对象而言也是唯一的。

在C++中,可以直接使用类域进行访问而不必初始化一个类的对象。

小demo

singleton.h 

[cpp] view plain copy
 
  1. #ifndef SINGLETON_H  
  2. #define SINGLETON_H  
  3. /* 
  4. 下面的实现其实是singleton的一个简单实现,并不是特别通用,一般的,如果一个项目中需要使用到singleton模式比较多的话,那么一般会实现一个singleton的模板类,模板类的模板参数是需要采用singleton模式的类,比如这样实现 
  5. http://blog.csdn.net/ouyangshima/article/details/7651708 
  6. template<typename T> 
  7. class Singleton 
  8. //...。类的声明 
  9. }; 
  10. //需要采用singleton模式的类 
  11. class Test : pulic Singleton<Test> 
  12. //...。类的声明 
  13. }; 
  14. */  
  15. #include <iostream>  
  16. class Singleton  
  17. {   
  18. public:  
  19.     // 静态成员函数,提供全局访问的接口  
  20.     static Singleton* GetInstancePtr();  
  21.     static Singleton  GetInstance();  
  22.     void Test();   
  23. private:   
  24.     Singleton(){};  
  25.     ~Singleton(){};      
  26.     static Singleton* m_pStatic;// 静态成员变量,提供全局惟一的一个实例  
  27.     class Garbo //它的唯一的工作就是在析构函数中删除Singleton的实例  
  28.     {  
  29.     public:  
  30.         ~Garbo()  
  31.         {  
  32.             if (Singleton::m_pStatic)  
  33.             {  
  34.                 delete Singleton::m_pStatic;   
  35.             }              
  36.         }  
  37.     };//内嵌一个私有类,以防该类被在其他地方滥用  
  38.     static Garbo mGarbo;//定义一个静态成员,在程序结束的时候,系统会调用它的析构函数  
  39. };  
  40.   
  41. #endif  

singleton.cpp

[cpp] view plain copy
 
  1. #include "Singleton.h"  
  2. #include <iostream>  
  3.   
  4. // 类的静态成员变量要在类体内进行声明,需要在cpp文件进行定义赋值,若在.h文件中赋值,当多个文件都保护.h文件时会出现重定义。  
  5. Singleton* Singleton::m_pStatic = NULL;//定义并初始化  
  6.   
  7. Singleton* Singleton::GetInstancePtr()  
  8. {  
  9.     if (NULL == m_pStatic)  
  10.     {  
  11.         m_pStatic = new Singleton();  
  12.     }  
  13.     return m_pStatic;  
  14. }  
  15.   
  16. Singleton Singleton::GetInstance()  
  17. {  
  18.     return *GetInstancePtr();  
  19. }  
  20.   
  21. void Singleton::Test()  
  22. {  
  23.     std::cout << "Test! ";  
  24. }  

main.cpp

[cpp] view plain copy
 
  1. #include "Singleton.h"  
  2. #include <stdlib.h>  
  3. #include <iostream>  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     //Singleton* s2=&(Singleton::GetInstance());//无法访问private或protected成员  
  8.     // 不用初始化类对象就可以访问了  
  9.     Singleton* s1=Singleton::GetInstancePtr();  
  10.     s1->Test();  
  11.     Singleton* s2=Singleton::GetInstancePtr();  
  12.     if (s1==s2)  
  13.         std::cout<<"ok"<<std::endl;  
  14.     else  
  15.         std::cout<<"no"<<std::endl;   
  16.     system("pause");  
  17.     return 0;  
  18. }  

Sinleton模式经常和Factory(AbstractFactory)模式在一起使用,因为系统中工厂对象一般来说只要一个,这里的工厂对象实现就是同时是一个Singleton模式的实例,因为系统我们就只要一个工厂来创建对象就可以了。

原文地址:https://www.cnblogs.com/timssd/p/5448325.html