C 單例模式

2021-09-19 01:29:01 字數 2899 閱讀 1061

乙個類只能建立乙個物件,即單例模式,該模式可以保證系統中該類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。

簡單的說就是,整個程式就需要乙份這個類,多了會浪費空間。怎麼弄才能更好的處理這種情況。

餓漢模式

餓漢嘛!餓嘛!所以啥也不管先來乙份吃的再說。

所以餓漢模式,就是在程式啟動的時候就建立乙個唯一的例項物件。

我們先看看**:

class

hungry_mode

private

:hungry_mode()

;hungry_mode

(hungry_mode const&)

; hungry_mode&

operator

=(hungry_mode const&)

;//or c++11

//hungry_mode(hungry_mode const&) = delete;

//hungry_mode& operator=(hungry_mode const&) = delete;

static hungry_mode _m_instance;};

hungry_mode hungry_mode::_m_instance;

我們將物件宣告為靜態變數,這樣就可以延長它的生命週期,並且,因為它的型別是這個類,所以宣告為靜態變數不算進類的大小裡,不然類還沒定義完,怎麼計算大小。

因為,這個變數只能定義一次,也就是說整個程式裡就只能有乙個變數物件。所以我們要把這個類的預設建構函式放進私有域裡,這樣就不能再定義其他物件了。我個人覺得,copy 構造也有必要放進私有域,copy assignment(賦值運算子過載)沒必要放進私有域。因為copy 構造也是在建立類的物件的時候呼叫,copy 構造也可以使用初始化列表來初始化物件。而copy assignment 就沒必要,因為只有已有物件才可以呼叫它,無法建立新的物件就沒辦法呼叫它,所以可以不把它放進私有域,但是為了統一還是放吧。

在共有域裡,定義了乙個靜態函式,用來返回這個靜態成員的位址。這個時候就可以保證,在沒有物件的時候可以通過類名去呼叫這個函式獲取靜態成員的位址。

優點:結構簡單,好理解。

缺點:可能會導致程序啟動慢,且如果有多個單例類物件例項啟動順序不確定。

如果這個單例物件在多執行緒高併發環境下頻繁使用,效能要求較高,那麼顯然使用餓漢模式來避免資源競爭,提高響應速度更好。

懶漢模式

如果單例物件的構造十分耗時或者占用很多資源,那麼程序啟動時就建立物件未免有點難受。

如果我們對這個單例物件的使用頻率不高,或者乾脆就用一次,那麼我們為什麼要在程序啟動時就建立它呢。

所以,懶漢模式就是用的時候再建立,並且只建立一次。懶漢,懶嘛!所以程序一啟動它懶得建立,非要等你用的時候再建立。

先看**:

1 #include 

2 #include 34

class

idler

516 _m_mtx.

unlock()

;17}18

19return _m_instance;20}

2122

class

cgorbo

2331}32

};3334

static cgorbo _cgorbo;

3536

private:37

idler()

;38idler

(idler const&)

=delete

;39 idler&

operator

=(idler const&)

=delete;40

41static std::mutex _m_mtx;

42static idler *_m_instance;43}

;4445 idler* idler::_m_instance =

nullptr

;46 std::mutex idler::_m_mtx;

47 idler::cgorbo _cgorbo;

因為是在linux下寫的**,行太多了懶得刪行號了。

懶漢模式是在用的時候呼叫建立物件,所以我們宣告乙個指標,建立的時候直接new, 得到位址返回位址。

如果在多執行緒情況下,無法保證執行緒的執行順序,或者有可能同時執行,所以乙個if的判斷,有可能兩個執行緒的_m_pinstance指標都為nullptr。所以我們需要加鎖。但是如果不用double check,那麼效率是非常低下的。就是這種情況:

idler*

getinstance

(void

) _m_mtx.

unlock()

;return _m_instance;

}

所有的執行緒判斷前,全部被擋住,乙個乙個判斷,這樣的效率非常低。double check就是保證了,第一次建立完成後,其他的執行緒只需要第一層判斷即可,大大提高了效率。

這裡有乙個內部類,完成清理的工作,這個內部類也是定義了乙個靜態變數,程式啟動時,就有,當程式結束時,它會自動呼叫內部類的析構函式,完成對單例物件的清理。

優點:第一次使用例項物件時,建立物件。程序啟動無負載。多個單例例項啟動順序自由控制。

缺點:設計太複雜啦。

C 單例模式

include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...

C 單例模式

實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...

C 單例模式

效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...