larbin 中的全局結構
單例不自動限制了多次的初始化,而且可以限定為具體幾個實例。但是不此處不能保證唯一的實例何時被銷毀。因此借鑒http://www.haogongju.net/art/1489844 朋友的文章。加入global.h//
struct global()
{
global();
static int a;
.....
}
global.cc 實現方法時用到的static變量 需要先 聲明初始化。
int global::a;
main中實現時只使用了一個實例。
而class單例則復雜些,不過可以更加安全 確保為實例為單一。
#include<iostream>
using namespace std;
class Singleton
{
public:
static Singleton * GetInstance()//通過靜態公有函數獲得該類的實例對象
{
if(m_pInstance==NULL)
m_pInstance=new Singleton();
return m_pInstance;
}
private:
Singleton(){}//構造函數私有化的目的是為了防止從別處實例化該類對象
static Singleton * m_pInstance;
class Garbo//刪除Singleton實例的對象
{
public:
~Garbo()
{
if(Singleton::m_pInstance)
{
delete Singleton::m_pInstance;
}
}
};
static Garbo gb;//在程序結束時,系統會調用它的析構函數
};
Singleton * Singleton::m_pInstance=NULL;//初始化靜態數據成員
int main()
{
Singleton *sl=Singleton::GetInstance();
return 0;
}此例 很好的使用了單例模式!
class CSingleton
{
//其他成員
public:
static CSingleton* GetInstance();
private:
CSingleton(){};
static CSingleton * m_pInstance;
class CGarbo //它的唯一工作就是在析構函數中刪除CSingleton的實例
{
public:
~CGarbo()
{
if( CSingleton::m_pInstance )
delete CSingleton::m_pInstance;
};
}
Static CGabor Garbo; //定義一個靜態成員,程序結束時,系統會自動調用它的析構函數
};
類CGarbo被定義為CSingleton的私有內嵌類,以防該類被在其他地方濫用。
程序運行結束時,系統會調用CSingleton的靜態成員Garbo的析構函數,該析構函數會刪除單例的唯一實例。
單例模式也稱為單件模式、單子模式,可能是使用最廣泛的設計模式。其意圖是保證一個類僅有一個實例,並提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。有很多地方需要這樣的功能模塊,如系統的日志輸出,GUI應用必須是單鼠標,MODEM的聯接需要一條且只需要一條電話線,操作系統只能有一個窗口管理器,一台PC連一個鍵盤。如log之類的模塊 ,被單例後,也要有被銷毀的時候。所以內嵌類,還是很靠譜的!!