定義
單件(singleton
)模式保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
結構
理解
1.singleton
模式用來取代全域性靜態變數。c++
通過靜態成員變數來實現類例項全域性唯一性。 2.
instance()
方法是單件提供的唯一呼叫入口。
要點
1. 為了防止外界呼叫產生多個例項,將構造方法、析構方法、拷貝構造方法、賦值過載方法都作為protected 。
2.instance()
方法產生物件方式有兩種:使用區域性static
物件,生命期在首次進入區域性生命期產生,在程式結束時銷毀;通過new
產生新物件,在析構方法中delete
物件。 3.
獲取單件例項呼叫方式:singleton::instance()
獲取物件指標。 4.
解決多執行緒資源競爭條件。使用著名的「雙檢測鎖定」辦法來解決,即在鎖定前和鎖定後都檢測物件是否產生,這樣既能保證加鎖效率又能保證單件例項的唯一性。
應用
1. **部分使用類模版單件(csingleton),可產生不同種類的單件類。 2.
乙個類要成為單件類,把單件類作為自己的友元來實現。因為csingleton
的構造和析構都是protected
。另外也有通過繼承單件來實現。 3.
單件可以很簡單實現,也可以足夠複雜。
loki
庫實現了乙個比較複雜的單件,將型別和各種策略(建立策略、生命期策略、執行緒策略等)作為模板引數,封裝成了singletonholder
類模板。詳細可見:
原始碼
#include
using
namespace
std;
//singleton定義
/**
* @class csingleton
* @brief 實現類把該類作為友元, 並且把建構函式作為非公有
* 如:
* class c
* ;
* }
*/
template
<
class
t>
class
csingleton
}
return
m_pinstance;
};
protected
:
csingleton(){};
//防止產生例項
csingleton(
const
csingleton&){};
//防止拷貝構造另乙個例項
csingleton &operator =(
const
csingleton&){};
//防止賦值構造出另乙個例項
virtual
~csingleton()
};
private
:
static
t* m_pinstance;
//類的唯一例項
//todo: 省略了互斥鎖成員m_lock
};
//singleton實現部分
template
<
class
t> t* csingleton::m_pinstance = null;
/singleton應用例項
class
cmylog
private
:
cmylog(){};
//不允許直接例項化
};
int
main()
c 設計模式 單件模式
前言 你可知我寫你不容易啊。本來想說幾句的,增加可讀性。但是後面再來改吧!include includeusing namespace std class singlton 靜態成員,指向唯一的物件 static singlton instance public get instance stati...
設計模式 單件
static變數從某種意義上說就是乙個單件,也就是只有乙個物件將被建立。它的分建立時機是 當它作為乙個類成員變數時,只有當類被建立或說是被分配記憶體空間時才會建立 如果它是乙個函式 包括類的成員函式 裡時,只是當成員函式第一次被使用時才會被建立。首先,我們提供乙個檔案的單件,為我們在使用檔案輸入輸出...
設計模式 單件模式
1 1 singleton.h ifndef singleton h define singleton h include using namespace std class singleton 構構函式,防止拷貝構造另乙個例項,作為protected singleton 析構函式,作為protec...