C 設計模式學習筆記 單例模式

2021-09-22 10:58:57 字數 1599 閱讀 4582

在《design patterns:elements of resuable object-oriented software》中的定義是:ensure a class only has one instance,and provide a global point of access to。它的主要特點不是依據客戶程式呼叫生成乙個新的例項,而是控制某個型別的例項數量-唯一乙個。

(《設計模式-基於c#的project化實現及擴充套件》。王翔)。也就是說,單例模式就是保證在整個應用程式的生命週期中,在不論什麼時刻,被指定的類僅僅有乙個例項,並為客戶程式提供乙個獲取該例項的全域性訪問點。

一、經典模式:

public

class

singleton

public

static

singleton getinstance()

return

instance; } }

解析例如以下:

1)首先,該singleton的建構函式必須是私有的,以保證客戶程式不會通過new()操作產生乙個例項。達到實現單例的目的;

2)由於靜態變數的生命週期跟整個應用程式的生命週期是一樣的,所以能夠定義乙個私有的靜態全域性變數instance來儲存該類的唯一例項;

3)必須提供乙個全域性函式訪問獲得該例項。而且在該函式提供控制例項數量的功能,即通過if語句推斷instance是否已被例項化,假設沒有則能夠同new()建立乙個例項;否則。直接向客戶返回乙個例項。

在這樣的經典模式下,沒有考慮執行緒併發獲取例項問題,就可以能出現兩個執行緒同一時候獲取instance例項,且此時其為null時。就會出現兩個執行緒分別建立了instance,違反了單例規則。

因此,需對上面**改動。

二、多執行緒下的單例模式

1、lazy模式

public

class

singleton

public

static

singleton getinstance() } }

return

instance; } }

上述**使用了雙重鎖方式較好地攻克了多執行緒下的單例模式實現。

先看內層的if語句塊,使用這個語句塊時。先進行加鎖操作。保證僅僅有乙個執行緒能夠訪問該語句塊,進而保證僅僅建立了乙個例項。

再看外層的if語句塊,這使得每乙個執行緒欲獲取例項時不必每次都得加鎖,由於僅僅有例項為空時(即須要建立乙個例項)。才需加鎖建立,若果已存在乙個例項。就直接返回該例項,節省了效能開銷。

2、餓漢模式

這樣的模式的特點是自動例項。

public

sealed

class

singleton

public

static

singleton getinstance() }

上面使用的readonly關鍵能夠跟static一起使用,用於指定該常量是類別級的,它的初始化交由靜態建構函式實現,並能夠在執行時編譯。在這樣的模式下。無需自己解決執行緒安全性問題,clr會給我們解決。由此能夠看到這個類被載入時。會自己主動例項化這個類。而不用在第一次呼叫getinstance()後才例項化出唯一的單例物件。

C 設計模式學習筆記 單例模式

最近在學設計模式,學到建立型模式的時候,碰到單例模式 或叫單件模式 現在整理一下筆記。在 design patterns elements of resuable object oriented software 中的定義是 ensure a class only has one instance,...

C 設計模式學習筆記 單例模式

在 design patterns elements of resuable object oriented software 中的定義是 ensurea class only has one instance,and provide a global point of access to。它的主要...

C 設計模式學習筆記 單例模式

本文 http 最近在學設計模式,學到建立型模式的時候,碰到單例模式 或叫單件模式 現在整理一下筆記。在 design patterns elements of resuable object oriented software 中的定義是 ensure a class only has one i...