zoukankan      html  css  js  c++  java
  • 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模式的实例,因为系统我们就只要一个工厂来创建对象就可以了。

  • 相关阅读:
    Hausdorff distance between mesh and its symmertic one.
    Fast algorithm to compute minimum volume oriented bounding box
    C++文件读写详解(ofstream,ifstream,fstream)
    libCURL开源库在VS2010环境下编译安装,配置详解
    VPB和OSGGIS安装
    OpenSceneGraph 笔记--如何导出三角形数据
    OpenGL编程指南(第七版)
    osgAnimation例子的注释的注释
    osg 示例程序解析之osgdelaunay
    VS2010+64+OSG3.2.1之五Plugins dae编译
  • 原文地址:https://www.cnblogs.com/timssd/p/5448325.html
Copyright © 2011-2022 走看看