學習設計模式—C++單例模式

來源:互聯網
上載者:User

原文連結: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. };  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.