《設計模式之禪》學習之單例模式

2021-05-27 02:59:05 字數 2167 閱讀 4033

何為單例模式,顧名思義,單例就是單一,單獨,獨一的意思。故單例模式[singleton pattern]我問可以定義為:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。通常我們可以讓乙個全部變數是的乙個物件被訪問,但是它不能防止你例項化多個物件。乙個最好的辦法就是,讓類自身負責儲存它的唯一例項。這個類可以保證

沒有其它例項可以被建立,並且它可以提供乙個訪問該例項的方法。簡而言之,就是類裡面定乙個私有的建構函式,外界就不能通過new 例項化了,對於外邊**,

在類裡面可以寫乙個公有方法,用來返回乙個類的例項。

類圖描述:

**例項:

單例模式下的類的源**:

class singleton

/// /// 獲得該類的物件例項的方法,是靜態的方法

///

/// 該類的例項物件

public static singleton getinstance()

return instance;}}

測試的**:

class program

console.readkey();}}

測試結果:

在多執行緒的程式中,多執行緒同事訪問singleton類,呼叫getinstance方法,會造成資料校驗一致性遭到破壞,業務邏輯也會變得混亂。怎麼修改呢,修改的方案很多,在這裡僅較介紹幾種常用的方案。

方案一:靜態初始化方法。「c#與公共語言執行庫也提供了一種『靜態初始化』方法,這種方法不需要開發人員顯示地編寫執行緒安全**,即可以解決多執行緒環境下它是不安全的問題。【msdn】」,更改singleton類,宣告私有成員時候,直接new乙個物件傳給類的成員變數instance,你要的時候直接去呼叫,getinstance方法,直接返回該類的例項化物件,問題解決,更改**如下:

public sealed class singleton//阻止派生,繼承此類的子類可能會增加例項

/// /// 獲得該類的物件例項的方法,是靜態的方法

///

/// 該類的例項物件

public static singleton getinstance()

return instance;}}

方案二:給程序加鎖,解決該方法。解釋一下lock,"lock是確保當乙個執行緒位於**的臨界區時,另乙個現成不進入臨界區。如果其他執行緒試圖進入鎖定的**,則他將一直等待(即被阻止),只到該物件被釋放。【msdn】",修改後的**如下,

public class singleton

/// /// 獲得該類的物件例項的方法,是靜態的方法

///

/// 該類的例項物件

public static singleton getinstance()

}return instance;}}

方法三:雙重鎖定,在例項未被建立的時候加鎖,可以保證執行緒的安全。**如下(注意區別不同之處),

private static  singleton instance;

//程式執行時,建立乙個靜態唯讀的程序輔助物件

private static readonly object syncroot = new object();

/// /// 私有建構函式,外部不能訪問

///

private singleton()

/// /// 獲得該類的物件例項的方法,是靜態的方法

///

/// 該類的例項物件

public static singleton getinstance()}}

return instance;}}

肯定會有人問,在外面已經判斷了instance例項是否存在,為什麼在lock裡面,還要進行一次instance例項是否存在的判斷呢 ?

呵呵,仔細分析一下便可明白。對於instance已經存在,直接返回,沒有問題。當instance為null時,並且同時有兩個現成呼叫getinstance方法,他們將都可以通過第一重instance == null 的判斷,然後由於lock機制,這兩個現成只有乙個進入,另乙個排隊,必須在要其中的乙個進入並出來之後,另乙個才能進入。而此時如果沒有第二重的判斷,第二個現成還可以繼續建立新的例項,沒有達到目的,故需要第二重的判斷。

設計模式之單例模式學習

單例模式是一種物件建立型模式,使用單例模式可以保證乙個類只生成唯一的例項物件。也就是說,在整個程式空間中,該類只存在乙個例項物件。gof對單例模式的定義是 保證乙個類 只有乙個例項存在,同時提供能對該例項加以訪問的全域性訪問方法。在應用系統開發中,我們常常有以下需求 單例模式有二種實現方式,餓漢式和...

《設計模式之禪》學習筆記(十五)

命令模式的定義 encapsulat a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable ...

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...