程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 學習設計模式---C++單例模式

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

編輯:C++入門知識

首先展示一個最簡單的單例模式例子,代碼如下:
[cpp] view plaincopy
class NetworkService 

public: 
    // 對外提供的唯一方法函數,用於獲取唯一的對象指針 
    static NetworkService* GetInstance() 
    { 
        if(m_pInstance == NULL) 
        { 
            m_pInstance = new NetworkService(); 
        } 
        return m_pInstance; 
    } 
 
private: 
    // 構造函數設置為私有,禁止用戶另外創建對象 
    NetworkService(); 
    static NetworkService* m_pInstance; 
}; 
//www.heatperss123.com
這程序看起來非常簡單,而且幾乎沒有什麼問題,然後直接使用NetworkService::GetInstance()就可以獲得對象指針了。不過這樣的程序實際隱含了個問題:這個唯一的對象應該在什麼時候被釋放呢?
一種方法,我們可以先實現一個析構自身資源的方法,然後通過GetInstance()來獲取對象自身,並調用這個方法來進行delete的操作。這樣的方法可行,不過實現方式並不好,至少來說,我們應該讓程序自己在合適的時候來釋放資源,而不是由外面的程序來調用這個操作。
那麼是否有更好的辦法來析構單例的對象呢?有,利用靜態變量的特點可以實現這樣的功能。我們知道,程序即將退出時,系統會自動析構所有的全局變量或靜態變量。而且,所有的類的靜態成員變量也會被自動析構。基於此,我們可以在單例類中定義一個這樣的靜態成員變量,它存在的目的就是當程序退出時,在析構函數中清除單例類的唯一實例。重新完善的代碼(參考自其他資料)如下所示,定義了一個Gargo的靜態成員:
[cpp]
class NetworkService 

public: 
    // 對外提供的唯一方法函數,用於獲取唯一的對象指針 
    static NetworkService* GetInstance() 
    { 
        if(m_pInstance == NULL) 
        { 
            m_pInstance = new NetworkService(); 
        } 
        return m_pInstance; 
    } 
 
private: 
    // 構造函數設置為私有,禁止用戶另外創建對象 
    NetworkService(); 
    static NetworkService* m_pInstance; 
 
    // 實現私有內嵌類, 用於類NetworkService的對象資源的釋放 
    class Garbo 
    { 
    public: 
        ~Garbo() 
        { 
            if(NetworkService::m_pInstance) 
            { 
                delete m_pInstance; 
            } 
        } 
    }; 
    // 程序運行結束時,系統會調用NetService的靜態成員garbo的析構函數, 
    // 該系夠函數會刪除NetService類的唯一實例 
    static Garbo garbo; 
}; 
類Garbo定義為類NetworkService的私有內嵌類,避免在其他的地方被使用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved