**定義**:單例模式(SingletonPattern),保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
類型:創建型模式
類圖:

**概述**:
??????在很多比較大型的程序中,全局變量經常被用到。如果不用全局變量,那么在使用到的模塊中,都需要用參數將全局變量傳入,這是非常麻煩的。雖然要減少使用全局變量,但是如果需要,還是要用。單例模式就是對傳統的全局的一種改進。單例可以做到延時實例化,即在需要的時候才進行實例化。針對一些大型的類,延時實例化是有好處的。
?????需要注意的是,在C#,Java中,有餓漢單例模式(即在聲明變量的時候就初始化)和懶漢模式(在需要使用的時候再初始化)。而在GoF的書中,只講到了懶漢模式,這是因為C++的靜態變量在初始化時具有不確定性。同一個類中的靜態變量初始化與其聲明順序一致,但是不同類中的靜態變量初始化順序卻是不確定的。
?????另外在多線程中,需要注意訪問的臨界區,需要加Lock用以控制。
代碼:添加了一個靜態對象用來處理內存垃圾回收。
~~~
//?C++
class?CSingleton
{
???//?私有構造函數,不被允許直接構造對象
private:
???CSingleton()
???{
???}
public:
???static?CSingleton*?GetInstance()
???{
???????if?(NULL?==?m_pSingleton)
???????????m_pSingleton?=?new?CSingleton();
???????return?m_pSingleton;
???}
???void?SetIdx(int?_nIdx)
???{
???????m_nIdx?=?_nIdx;
???}
???int?GetIdx()
???{
???????return?m_nIdx;
???}
private:
???int?m_nIdx;
???static?CSingleton*?m_pSingleton;
public:
???class?CRecycle
???{
???public:
???????~CRecycle()
???????{
???????????if?(NULL?!=CSingleton::m_pSingleton)
???????????{
???????????????deleteCSingleton::m_pSingleton;
???????????}
???????}
???};
???static?CRecycle?m_recycle;
};
//?靜態成員變量的初始化
CSingleton*CSingleton::m_pSingleton?=?NULL;
CSingleton::CRecycleCSingleton::m_recycle;
int?_tmain(int?argc,_TCHAR*?argv[])
{
???CSingleton::GetInstance()->SetIdx(1);
?
return0;
}
~~~
優缺點:
1. 優點,能夠靈活地控制什么時候去訪問。
1. 缺點,和其他模塊耦合性太強,作為全局變量的通病。
參考資料:
1. 《設計模式——可復用面向對象軟件基礎》
1. 《Java與模式》
1. 《大話設計模式》
- 前言
- 設計模式六大原則
- 1——創建型模式之簡單工廠模式
- 2——創建型模式之工廠方法模式
- 3——創建型模式之抽象工廠模式
- 4——創建型模式之單例模式
- 5——創建型模式之建造者模式
- 6——創建型模式之原型模式
- 7——結構型模式之適配器模式
- 8——結構型模式之橋接模式
- 9——結構型模式之組合模式
- 10——結構型模式之裝飾者模式
- 11——結構型模式之外觀模式
- 12——結構型模式之享元模式
- 13——結構型模式之代理模式
- 14——行為型模式之職責鏈模式
- 15——行為型模式之命令模式
- 16——行為型模式之解釋器模式
- 17——行為型模式之迭代器模式
- 18——行為型模式之中介者模式
- 19——行為型模式之備忘錄模式
- 20——行為型模式之觀察者模式
- 21——行為型模式之狀態模式
- 22——行為型模式之策略模式
- 23——行為型模式之模板方法模型
- 24——行為型模式之訪問者模式
- 設計模式總結