單例(Singleton)模式

2021-06-03 08:53:25 字數 2505 閱讀 8302

單例模式的特點:

singleton模式包含的角色只有乙個,那就是singleton。singleton擁有乙個私有建構函式,確保使用者無法通過new取得singleton的例項。除此之外,該模式中包含乙個靜態私有成員變數instance與靜態公有方法instance。instance方法負責檢驗並例項化自己,然後儲存在靜態成員變數中,以確保只有乙個例項被建立。

五種實現

1.簡單實現

public class singleton

public static getinstance()

return instance;}}

2.安全的執行緒

public sealed class singleton

public static getinstance()

return instance;

} }

}

這種方式的實現對於執行緒來說是安全的。我們首先建立了乙個程序輔助物件,執行緒在進入時先對輔助物件加鎖然後再檢測物件是否被建立,這樣可以確保只有乙個例項被建立,因為在同乙個時刻加了鎖的那部分程式只有乙個執行緒可以進入。這種情況下,物件例項由最先進入的那個執行緒建立,後來的執行緒在進入時(instence == null)為假,不會再去建立物件例項了。但是這種實現方式增加了額外的開銷,損失了效能。

3.雙重鎖定

public sealed class singleton

public static getinstance()

}} return instance;}}

這種實現方式對多執行緒來說是安全的,同時執行緒不是每次都加鎖,只有判斷物件例項沒有被建立時它才加鎖,有了我們上面第一部分的裡面的分析,我們知道,加鎖後還得再進行物件是否已被建立的判斷。它解決了執行緒併發問題,同時避免在每個instance屬性方法的呼叫中都出現獨佔鎖定。它還允許您將例項化延遲到第一次訪問物件時發生。實際上,應用程式很少需要這種型別的實現。大多數情況下我們會用靜態初始化。這種方式仍然有很多缺點:無法實現延遲初始化。

4.靜態初始化

public sealed class singleton

private static readonly singleton instance=new singleton();

public static singleton getsingleton()

}

在此實現中,將在第一次引用類的任何成員時建立例項。公共語言執行庫負責處理變數初始化。該類標記為sealed以阻止發生派生,而派生可能會增加例項。此外,變數標記為readonly,這意味著只能在靜態初始化期間(此處顯示的示例)或在類建構函式中分配變數。

該實現與前面的示例類似,不同之處在於它依賴公共語言執行庫來初始化變數。它仍然可以用來解決singleton模式試**決的兩個基本問題:全域性訪問和例項化控制。公共靜態屬性為訪問例項提供了乙個全域性訪問點。此外,由於建構函式是私有的,因此不能在類本身以外例項化singleton類;因此,變數引用的是可以在系統中存在的唯一的例項。

由於singleton例項被私有靜態成員變數引用,因此在類首次被對instance屬性的呼叫所引用之前,不會發生例項化。

這種方法唯一的潛在缺點是,您對例項化機制的控制權較少。在design patterns形式中,您能夠在例項化之前使用非預設的建構函式或執行其他任務。由於在此解決方案中由.net framework負責執行初始化,因此您沒有這些選項。在大多數情況下,靜態初始化是在.net中實現singleton的首選方法。

5.延遲初始化

public sealed class singleton

public static singleton getsingleton() }

public class nested

internal static readonly singleton instance=new singleton();

}

這裡,初始化工作有nested類的乙個靜態成員來完成,這樣就實現了延遲初始化,並具有很多的優勢,是值得推薦的一種實現方式。

實現要點

優點

缺點

Singleton 單例 模式

singleton 模式的宗旨在於確保某個類只有乙個例項,別且為之提供乙個全域性訪問點。為了防止其他工作人員例項化我們的類,可以為該類建立唯一乙個構造器,並將構造器的可見 設定為私有。值得注意的是,如果我們建立了其他的非私有的構造器,或者根本沒有為該類提 供構造器,那麼其他人員還是能例項化我們的類。...

Singleton 單例 模式

今天看了,單例模式。感覺他的本質就是,控制類例項的個數。特例就是,控制static變數的唯一性,保證各個程式共享著同一例項。乙個例子 package singleton description 這是乙個單例模式的使用demo author kyle goal 實現乙個類僅有乙個例項 singleto...

單例模式(Singleton)

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。通常我們可以讓乙個全域性變數使得乙個物件被訪問,但它不能防止你例項化多個物件。乙個最好的辦法就是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立,並且它可以提供乙個訪問該例項的方法。uml圖如下...