首先展示一個最簡單的單例模式例子,代碼如下:
[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的私有內嵌類,避免在其他的地方被使用。