何為單例模式,顧名思義,單例就是單一,單獨,獨一的意思。故單例模式[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種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...