.NET單例模式的另類實(shí)現(xiàn)方式Lazy
簡介
在C#中,Lazy<T> 是一個(gè)泛型類,用于延遲加載對(duì)象的創(chuàng)建,直到第一次訪問該對(duì)象時(shí)才會(huì)實(shí)例化。這種延遲加載的方式有助于提高性能和資源利用率,尤其是在處理大量數(shù)據(jù)或耗時(shí)的操作時(shí)。主要用途有“延遲加載”,“性能優(yōu)化”,“單例模式”,本文將介紹Lazy<T>實(shí)現(xiàn)單例模式。
Lazy<T>實(shí)現(xiàn)單例簡介
單例模式是一種創(chuàng)建型設(shè)計(jì)模式,其目的是確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn)以便于其他代碼獲取該實(shí)例。這對(duì)于需要共享某些資源或狀態(tài)的情況非常有用。而Lazy<T>延遲加載對(duì)象的特性,可以讓對(duì)象第一次訪問才會(huì)實(shí)例化,第二次及以后的訪問將不再創(chuàng)建新的對(duì)象。Lazy<T> 會(huì)記住第一次創(chuàng)建的實(shí)例,從而實(shí)現(xiàn)另類單例模式。
Lazy<T>實(shí)現(xiàn)單例案例
以下是一個(gè)使用 Lazy<T> 實(shí)現(xiàn)單例模式的示例
public class Singleton{// 使用 Lazy<T> 來確保線程安全的延遲加載private static readonly Lazy<Singleton> lazyInstance = new Lazy<Singleton>(() => new Singleton(), LazyThreadSafetyMode.ExecutionAndPublication);
// 私有構(gòu)造函數(shù),防止外部直接實(shí)例化private Singleton(){// 初始化操作Console.WriteLine("單例實(shí)例創(chuàng)建.");}// 公共訪問點(diǎn),通過 lazyInstance.Value 獲取單例實(shí)例public static Singleton Instance => lazyInstance.Value;
public void Fun(){Console.WriteLine("調(diào)用方法測試:歡迎關(guān)注公眾號(hào)“DOTNET開發(fā)跳槽”");}}//調(diào)用// 獲取單例實(shí)例Singleton instance1 = Singleton.Instance;Singleton instance2 = Singleton.Instance;// 驗(yàn)證是否為同一實(shí)例Console.WriteLine($"否為同一實(shí)例? {instance1 == instance2}");//方法調(diào)用instance2.Fun();
在這個(gè)例子中,Singleton 類有一個(gè)私有的 Lazy<Singleton> 實(shí)例,使用 LazyThreadSafetyMode.ExecutionAndPublication 確保線程安全。通過訪問 Singleton.Instance 屬性,從而獲取單例實(shí)例,這會(huì)觸發(fā) Lazy<T> 去執(zhí)行構(gòu)造函數(shù)。
執(zhí)行結(jié)果:

調(diào)用的時(shí)候分兩次調(diào)用,驗(yàn)證是否相等。并調(diào)用了類中的測試方法。從上圖的測試結(jié)果可以看出他們的實(shí)例相同,并且方法成功調(diào)用。
是否實(shí)用呢?
Lazy<T> 能夠?qū)崿F(xiàn)單例模式也不一定代表實(shí)用,下面將介紹它的優(yōu)缺點(diǎn)。
優(yōu)勢有如下幾點(diǎn):
1、延遲加載:對(duì)象只有在需要的時(shí)候才被創(chuàng)建,避免了不必要的性能開銷。
2、線程安全:Lazy<T> 提供了線程安全的延遲加載,確保只有一個(gè)線程創(chuàng)建對(duì)象。
3、簡潔性: 這里的簡潔是相對(duì)復(fù)雜的單例模式,通過 Lazy<T>,可以簡潔地實(shí)現(xiàn)單例模式,而不需要顯式的雙重檢查鎖定等復(fù)雜手段。
缺點(diǎn):
使用 Lazy<T> 實(shí)現(xiàn)單例模式的缺點(diǎn)包括潛在的性能開銷,延遲加載可能引入復(fù)雜性和增加代碼難以維護(hù)的可能性。此外,全局可訪問的單一實(shí)例可能導(dǎo)致不必要的耦合和全局狀態(tài),而且在多線程環(huán)境中可能引入死鎖問題。需要仔細(xì)權(quán)衡利弊,確保 Lazy<T> 的使用符合應(yīng)用程序的實(shí)際需求,并在考慮其他設(shè)計(jì)選項(xiàng)時(shí)保持警覺。
所以 在需要延遲加載、避免性能開銷和確保線程安全的情況下,使用 Lazy<T> 實(shí)現(xiàn)單例模式。
結(jié)語
本文介紹了使用Lazy<T>實(shí)現(xiàn)單例模式的方法和案例,并歸納了 Lazy<T> 實(shí)現(xiàn)單例模式的實(shí)用性。大家都Lazy<T>實(shí)現(xiàn)單例模式有什么看法,歡迎留言討論或者吐槽本文。
參考:
1、learn.microsoft.com/zh-cn/dotnet/api/system.lazy-1.-ctor?view=net-8.0
2、AI查詢
關(guān)注公眾號(hào)↑↑↑:DotNet開發(fā)跳槽?
