zoukankan      html  css  js  c++  java
  • 【转】C++ 单例模式

    http://blog.csdn.net/hackbuteer1/article/details/7460019

     单例的一般实现比较简单,下面是代码和UML图。由于构造函数是私有的,因此无法通过构造函数实例化,唯一的方法就是通过调用静态函数GetInstance。

     UML图:

    考虑到线程安全、异常安全,需要加锁,可以做以下扩展

    1. class Lock  
    2. {  
    3. private:         
    4.     CCriticalSection m_cs;  
    5. public:  
    6.     Lock(CCriticalSection  cs) : m_cs(cs)  
    7.     {  
    8.         m_cs.Lock();  
    9.     }  
    10.     ~Lock()  
    11.     {  
    12.         m_cs.Unlock();  
    13.     }  
    14. };  
    15.   
    16. class Singleton  
    17. {  
    18. private:  
    19.     Singleton();  
    20.     Singleton(const Singleton &);  
    21.     Singleton& operator = (const Singleton &);  
    22.     static Singleton *pInstance; 
    23.   
    24. public:  
    25.     static Singleton *Instantialize();  
    26.     static CCriticalSection cs;  
    27. };  
    28.   
    29. Singleton* Singleton::pInstance = 0;  
    30.   
    31. Singleton* Singleton::Instantialize()  
    32. {  
    33.     if(pInstance == NULL)  
    34.     {   //double check  
    35.         Lock lock(cs);           //用lock实现线程安全,用资源管理类,实现异常安全  
    36.                                         
    37.         //使用资源管理类,在抛出异常的时候,资源管理类对象会被析构,析构总是发生的无论是因为异常抛出还是语句块结束。  
    38.         if(pInstance == NULL)  
    39.         {  
    40.             pInstance = new Singleton();  
    41.         }  
    42.     }     --》 //my注释:这里的lock类为局部变量,在这里会被析构,即会被解锁。
    43.     return pInstance;  
    44. }  
  • 相关阅读:
    docker学习-01-安装docker
    nginx静态资源服务器配置
    通过plink 远程连接linux并执行shell脚本
    MyEclipse tomcat jsk配置--- jvm blind 异常
    95%的中国网站需要重写CSS
    Oracle中如何插入特殊字符:& 和 ' (多种解决方案)
    hibernate动态表名映射
    Nginx+Tomcat搭建高性能负载均衡集群
    sql学习笔记
    关于初步搭建完成SSH环境之后,JUnit test 测试成功,页面测试时:@Resource 注入的dao为null
  • 原文地址:https://www.cnblogs.com/maxpak/p/4487437.html
Copyright © 2011-2022 走看看