單例模式一句話的來講就是,這個類只存在乙個例項化物件。
如何實現例項化?
既然只能有乙個例項化物件,那麼就要防止被多次例項化,如何防止?就要把建構函式私有化或者受保護,這樣建構函式就無法被外部呼叫,只能被類內部的成員函式呼叫,所以我們需要定義乙個公有函式來供外部使用,這個公有函式返回乙個物件,為了保證多次呼叫這個公有函式都會返同乙個物件,就需要將這個給物件設定為靜態的。
簡單總結一下需要注意三點:
一、建構函式需要私有或者受保護;
二、定義靜態物件;
三、定義靜態公有函式
單例模式分為懶漢模式和餓漢模式。
懶漢模式,一開始不例項化,等到呼叫的時候才進行例項化,顧名思義,比較懶,用時間換空間。
餓漢模式,一開始就進行了例項化,顧名思義,比較餓,用空間換時間。
可以通過加鎖來達到執行緒安全
//懶漢式單例模式,第一次用到類例項的時候才去例項化
//單執行緒下是正確的,多執行緒同時檢測到instance=null,則兩個執行緒同時構造乙個例項給instance
class
singleton1
//私有的建構函式
static singleton1* instance;
//全域性訪問點
public
:static singleton1*
getinstance()
return instance;}}
; singleton1* singleton1::instance =
null
;
class
singleton2
;//指向singleton2物件的指標
static singleton2* instance;
public
:static singleton2*
getinstance()
}; singleton2* singleton2::instance =
new singleton2;
// 在程式入口之前就完成單例物件的初始化
雖然說在懶漢的公有函式裡給判斷前後加個鎖可以有效解決這個問題,但是即使這樣,和餓漢比起來會很繁瑣,故孰優孰劣,大家懂的。
單例可以問一堆問題
1。 如何保證唯一?
2。如何處理初始化依賴?
3。初始化時,是否執行緒安全
4。程序退出時,能否自動釋放資源?
如何保證唯一:防止被多次例項化,如何防止?就要把建構函式私有化或者受保護,這樣建構函式就無法被外部呼叫,只能被類內部的成員函式呼叫,所以我們需要定義乙個公有函式來供外部使用,這個公有函式返回乙個物件,為了保證多次呼叫這個公有函式都會返同乙個物件,就需要將這個給物件設定為靜態的。
如何處理初始化依賴:
初始化時,是否執行緒安全:懶漢如果不加鎖就不安全,加鎖就可以安全,但是加了鎖之後和餓漢比起來會很繁瑣。餓漢是安全的。
程序退出時,能否自動釋放資源:需要實現乙個內嵌**類。
C 實現單例模式
給所需要進行單例的類ctest的建構函式宣告為private或者protected 防止在類外隨意生成ctest的物件 然後宣告乙個靜態成員變數 instance 乙個靜態成員函式getinsance staticctest getinstance staticctest instance 靜態成員...
C 實現單例模式
ifndef singleton h define singleton h include include using namespace std class locker inline locker inline void lock inline void unlock private pthre...
C 實現單例模式
class singleton 私有建構函式 singleton const singleton 拷貝建構函式,只宣告不定義,這要當使用者或友元想要拷貝構造該類的已存在例項時會出錯。singleton operator const singleton 賦值運算子,只宣告不定義,作用同上 public...