zoukankan      html  css  js  c++  java
  • 学习设计模式C++单例模式

    原文链接:http://www.cppblog.com/jialisoft/archive/2012/09/26/192071.html

    首先展示一个最简单的单例模式例子,代码如下:

    1. class NetworkService  
    2. {  
    3. public:  
    4.     // 对外提供的唯一方法函数,用于获取唯一的对象指针  
    5.     static NetworkService* GetInstance()  
    6.     {  
    7.         if(m_pInstance == NULL)  
    8.         {  
    9.             m_pInstance = new NetworkService();  
    10.         }  
    11.         return m_pInstance;  
    12.     }  
    13.   
    14. private:  
    15.     // 构造函数设置为私有,禁止用户另外创建对象  
    16.     NetworkService();  
    17.     static NetworkService* m_pInstance;  
    18. };  
      //www.heatperss123.com

    这程序看起来非常简单,而且几乎没有什么问题,然后直接使用NetworkService::GetInstance()就可以获得对象指针了。不过这样的程序实际隐含了个问题:这个唯一的对象应该在什么时候被释放呢?

    一种方法,我们可以先实现一个析构自身资源的方法,然后通过GetInstance()来获取对象自身,并调用这个方法来进行delete的操作。这样的方法可行,不过实现方式并不好,至少来说,我们应该让程序自己在合适的时候来释放资源,而不是由外面的程序来调用这个操作。

    那么是否有更好的办法来析构单例的对象呢?有,利用静态变量的特点可以实现这样的功能。我们知道,程序即将退出时,系统会自动析构所有的全局变量或静态变量。而且,所有的类的静态成员变量也会被自动析构。基于此,我们可以在单例类中定义一个这样的静态成员变量,它存在的目的就是当程序退出时,在析构函数中清除单例类的唯一实例。重新完善的代码(参考自其他资料)如下所示,定义了一个Gargo的静态成员:

      1. class NetworkService  
      2. {  
      3. public:  
      4.     // 对外提供的唯一方法函数,用于获取唯一的对象指针  
      5.     static NetworkService* GetInstance()  
      6.     {  
      7.         if(m_pInstance == NULL)  
      8.         {  
      9.             m_pInstance = new NetworkService();  
      10.         }  
      11.         return m_pInstance;  
      12.     }  
      13.   
      14. private:  
      15.     // 构造函数设置为私有,禁止用户另外创建对象  
      16.     NetworkService();  
      17.     static NetworkService* m_pInstance;  
      18.   
      19.     // 实现私有内嵌类, 用于类NetworkService的对象资源的释放  
      20.     class Garbo  
      21.     {  
      22.     public:  
      23.         ~Garbo()  
      24.         {  
      25.             if(NetworkService::m_pInstance)  
      26.             {  
      27.                 delete m_pInstance;  
      28.             }  
      29.         }  
      30.     };  
      31.     // 程序运行结束时,系统会调用NetService的静态成员garbo的析构函数,  
      32.     // 该系够函数会删除NetService类的唯一实例  
      33.     static Garbo garbo;  
      34. };  
  • 相关阅读:
    Codeforces 1291 Round #616 (Div. 2) B
    总结
    刷新DNS解析缓存+追踪+域名解析命令
    数学--数论--Hdu 5793 A Boring Question (打表+逆元)
    Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析
    LeetCode 117 Populating Next Right Pointers in Each Node II
    LeetCode 116 Populating Next Right Pointers in Each Node
    test test
    LeetCode 115 Distinct Subsequences
    LeetCode 114. Flatten Binary Tree to Linked List
  • 原文地址:https://www.cnblogs.com/wangkangluo1/p/2713512.html
Copyright © 2011-2022 走看看