c 設計模式之單例模式

2022-07-22 14:27:19 字數 2395 閱讀 5585

單例模式:用來建立獨一無二的,只能夠有乙個例項的物件。 單例模式的結構是設計模式中最簡單的,但是想要完全實現乙個執行緒安全的單例模式還是有很多陷阱的,所以面試的時候屬於乙個常見的考點~

單例模式的應用場景:有一些物件其實只需要乙個,比如:執行緒池,快取,對話方塊,處理偏好設定和登錄檔的物件,日誌物件,充當印表機,顯示卡等裝置的驅動程式物件。這些物件只能夠擁有乙個例項,如果建立出了多個例項,就會導致一些程式的問題。程式的行為異常,資源使用的過量,或者導致不一致的結果。常用來管理共享的資源,比如資料庫的連線或者執行緒池。

我們都很清楚乙個簡單的單例模式該怎樣去實現:建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。

class

singleton

private

:

static singleton*p;

public

:

static singleton*instance();

};singleton* singleton::p =null;

singleton*singleton::instance()

這是乙個很棒的實現,簡單易懂。但這是乙個完美的實現嗎?不!該方法是執行緒不安全的,考慮兩個執行緒同時首次呼叫instance方法且同時檢測到p是null值,則兩個執行緒會同時構造乙個例項給p,這是嚴重的錯誤!同時,這也不是單例的唯一實現!

2 懶漢與餓漢

單例大約有兩種實現方法:懶漢與餓漢。

特點與選擇:

3 執行緒安全的懶漢實現

執行緒不安全,怎麼辦呢?最直觀的方法:加鎖。

class

singleton

private

:

static singleton*p;

public

:

static

pthread_mutex_t mutex;

static singleton*initance();

};pthread_mutex_t singleton::mutex;

singleton* singleton::p =null;

singleton*singleton::initance()

return

p;}

互斥的同步會導致效能的降低,即使p已經不為空了,每次還是需要加鎖,這樣操作花費就比較多,效能必定比較差。

此方法也很容易實現,在instance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。推薦這種實現方法,真得非常簡單。

class

singleton

public

:

static

pthread_mutex_t mutex;

static singleton*initance();

inta;

};pthread_mutex_t singleton::mutex;

singleton*singleton::initance()

4 餓漢實現

餓漢實現本來就是執行緒安全的,不用加鎖。

class

singleton

private

:

static singleton*p;

public

:

static singleton*initance();

};singleton* singleton::p = new

singleton;

singleton*singleton::initance()

*另外一種提公升因為同步導致的效能變差的方法稱為「雙重檢驗加鎖」。方法如下:

思路是只有在第一次建立的時候進行加鎖,當_instance不為空的時候就不需要進行加鎖的操作,這樣就可以提公升效能~

class

lock

~lock()

};class

singleton

protected

: singleton();

private

:

static singleton*_instance;

static

mutex m;}

singleton *singleton::_instance =null;

singleton*singleton::getinstance()

}return

_instance;

}

**:

C 設計模式之單例模式

在遊戲開發過程中,我們時常會遇到單例模式的運用場景。比如你遊戲當中的最終boss,你希望你的boss只能有乙個,所以這裡你就可以用單例模式 那麼什麼是單例模式呢?看下面的 分析。include include using namespace std class singleton public st...

C 設計模式之單例模式

設計模式是以理論的高度,總結了開發過程中的一多種不同的方法,在各種設計模式中,它們都有著不同實現方式,所起的作用也不相同,我最近看了部分設計模式,主要是以我自己的理解來闡述對它們的看法。我們可以看到單例的大概實現是很簡單的。幾個需要注意的地方是 只有當我們的建構函式為私有時,此時,我們在類外部就不能...

C 設計模式之 單例模式

單例模式,故名思義,其意圖是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有的程式模組共享.在很多地方要用到這種設計模式,如系統的日誌輸出,作業系統的視窗,乙個pc連乙個鍵盤等.單例模式有許多實現方法.第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項,需要加鎖...