單例模式(Singleton Pattern)

2021-06-01 09:02:13 字數 1549 閱讀 9289

在《design patterns:elements of resuable object-oriented software》中的定義是:ensure a class only has one instance,and provide a global point of access to。它的主要特點不是根據客戶程式呼叫生成乙個新的例項,而是控制某個型別的例項數量-唯一乙個。(《設計模式-基於c#的工程化實現及擴充套件》,王翔)。也就是說,單例模式就是保證在整個應用程式的生命週期中,在任何時刻,被指定的類只有乙個例項,並為客戶程式提供乙個獲取該例項的全域性訪問點。

/// /// 經典模式:

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

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

/// 3)必須提供乙個全域性函式訪問獲得該例項,並且在該函式提供控制例項數量的功能,即通過if語句判斷instance是否已被例項化,

/// 如果沒有則可以同new()建立乙個例項;否則,直接向客戶返回乙個例項。

///

public class singleton

public static singleton sinstance

return instance;}}

}/// /// 多執行緒模式(lazy模式)

/// 在經典模式下,沒有考慮執行緒併發獲取例項問題,即可能出現兩個執行緒同時獲取instance例項,且此時其為null時,

/// 就會出現兩個執行緒分別建立了instance,違反了單例規則。因此,需對上面**修改。

/// **使用了雙重鎖方式較好地解決了多執行緒下的單例模式實現。先看內層的if語句塊,使用這個語句塊時,先進行加鎖操作,

/// 保證只有乙個執行緒可以訪問該語句塊,進而保證只建立了乙個例項。再看外層的if語句塊,這使得每個執行緒欲獲取例項時不必每次都得加鎖,

/// 因為只有例項為空時(即需要建立乙個例項),才需加鎖建立,若果已存在乙個例項,就直接返回該例項,節省了效能開銷。

///

public class lazysingleton

public static lazysingleton sinstance}}

return instance;}}

}/// /// 主動例項(餓漢模式):這種模式的特點是自己主動例項。

/// 使用的readonly關鍵可以跟static一起使用,用於指定該常量是類別級的,它的初始化交由靜態建構函式實現,

/// 並可以在執行時編譯。在這種模式下,無需自己解決執行緒安全性問題,clr會給我們解決。由此可以看到這個類被載入時,

/// 會自動例項化這個類,而不用在第一次呼叫getinstance()後才例項化出唯一的單例物件。

///

public sealed class hungrysingleton

public static hungrysingleton sinstance

}}

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...

單例模式 懶漢式單例模式

單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...