.Net 單例模式(Singleton)
問題描述:
單例模式 Singleton Pattern
問題解決:
(1)單例模式簡介:
Singleton模式要求一個類有且僅有一個實例,并且提供了一個全局的訪問點。這就提出了一個問題:如何繞過常規(guī)的構造器,提供一種機制來保證一個類只有一個實例?客戶程序在調用某一個類時,它是不會考慮這個類是否只能有一個實例等問題的,所以,這應該是類設計者的責任,而不是類使用者的責任。
單例模式特點:
(1.1)一個類有且僅有一個實例
(1.2)類提供一個全局的訪問點
(2)單例模式的實現:
(2.1)簡單實現:

上述實現的優(yōu)點:
(1)直到對象要求時,才進行實例的初始化,這種實現方法稱為:“惰性實例化”,惰性實例化,避免了程序啟動時創(chuàng)建不必要的Singleton。
上述實現的缺點:
(1)這種實現對于多線程環(huán)境并不安全,可能實例化多個對象,例如可能存在兩個線程進行instance==null的判斷,然后創(chuàng)建兩個單例對象,這就違背了單例模式的設計意圖。
(2.2)安全的線程:

以上的實現保證了單例對象在多線程的情況下只會創(chuàng)建一個,但是padlock增加了額外的開銷
(2.3)雙重鎖定

這種實現方式對多線程來說是安全的,同時線程不是每次都加鎖,只有判斷對象實例沒有被創(chuàng)建時它才加鎖,有了我們上面第一部分的里面的分析,我們知道,加鎖后還得再進行對象是否已被創(chuàng)建的判斷。它解決了線程并發(fā)問題,同時避免在獲取 Instance 的調用中都出現獨占鎖定。它還允許您將實例化延遲到第一次訪問對象時發(fā)生。實際上,應用程序很少需要這種類型的實現。大多數情況下我們會用靜態(tài)初始化。這種方式仍然有很多缺點:無法實現延遲初始化。
(2.4)靜態(tài)初始化

此實現中,將在第一次引用類的任何成員創(chuàng)建實例,該類標記為 sealed 以阻止發(fā)生派生,而派生可能會增加實例。此外,變量標記為 readonly,這意味著只能在靜態(tài)初始化期間(此處顯示的示例)或在類構造函數中分配變量。它仍然可以用來解決 Singleton 模式試圖解決的兩個基本問題:全局訪問和實例化控制。公共靜態(tài)屬性為訪問實例提供了一個全局訪問點。此外,由于構造函數是私有的,因此不能在類本身以外實例化 Singleton 類;因此,變量引用的是可以在系統中存在的唯一的實例。
由于 Singleton 實例被私有靜態(tài)成員變量引用,因此在類首次被對 Instance 屬性的調用所引用之前,不會發(fā)生實例化。這種方法唯一的潛在缺點是,您對實例化機制的控制權較少。在 Design Patterns 形式中,您能夠在實例化之前使用非默認的構造函數或執(zhí)行其他任務。由于在此解決方案中由 .NET Framework 負責執(zhí)行初始化,因此您沒有這些選項。在大多數情況下,靜態(tài)初始化是在 .NET 中實現 Singleton 的首選方法。
(2.5)延遲初始化:

(3)單例模式的優(yōu)缺點:

(4)單例模式適用情況和應用場景:

(5)具體實例:
總結:
Singleton設計模式是一個非常有用的機制,可用于在面向對象的應用程序中提供單個訪問點。
相關文章
利用FastReport傳遞圖片參數在報表上展示簽名信息的實現方法
這篇文章主要介紹了利用FastReport傳遞圖片參數在報表上展示簽名信息,其中主要注意的是,我們傳遞的圖片數據需要采用Base64String的格式才能正常傳遞和展示,本文通過圖文實例代碼相結合給大家介紹的非常詳細,需要的朋友可以參考下2022-10-10
asp.net 中靜態(tài)方法和動態(tài)方法調用的區(qū)別實例分析
動態(tài)方法,在使用時需要先創(chuàng)建實例,才能調用實例方法,而靜態(tài)方法則不需要,直接使用即可。2013-06-06
.net 中的 StringBuilder 和 TextWriter 區(qū)別詳解
這篇文章主要介紹了.net 中的 StringBuilder 和 TextWriter 區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09

