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. }  
  • 相关阅读:
    BZOJ 2034 【2009国家集训队】 最大收益
    vijos P1780 【NOIP2012】 开车旅行
    BZOJ 2115 【WC2011】 Xor
    BZOJ 3631 【JLOI2014】 松鼠的新家
    BZOJ 4717 改装
    BZOJ 2957 楼房重建
    BZOJ 4034 【HAOI2015】 T2
    BZOJ 1834 【ZJOI2010】 network 网络扩容
    BZOJ 2440 【中山市选2011】 完全平方数
    BZOJ 2733 【HNOI2012】 永无乡
  • 原文地址:https://www.cnblogs.com/maxpak/p/4487437.html
Copyright © 2011-2022 走看看