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

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

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

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

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

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

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

(5)具體實(shí)例:
總結(jié):
Singleton設(shè)計(jì)模式是一個非常有用的機(jī)制,可用于在面向?qū)ο蟮膽?yīng)用程序中提供單個訪問點(diǎn)。
- 五種單件模式之Singleton的實(shí)現(xiàn)方法詳解
- 基于靜態(tài)Singleton模式的使用介紹
- C#多線程Singleton(單件)模式模板
- php設(shè)計(jì)模式 Singleton(單例模式)
- javascript 單例/單體模式(Singleton)
- .NET c# 單體模式(Singleton)
- Python設(shè)計(jì)模式之單例模式實(shí)例
- Python設(shè)計(jì)模式之觀察者模式實(shí)例
- Python設(shè)計(jì)模式之代理模式實(shí)例
- python中g(shù)etattr函數(shù)使用方法 getattr實(shí)現(xiàn)工廠模式
- Windows 配置Apache以便在瀏覽器中運(yùn)行Python script的CGI模式
- Python下singleton模式的實(shí)現(xiàn)方法
相關(guān)文章
asp.net(C#)實(shí)現(xiàn)功能強(qiáng)大的時間日期處理類完整實(shí)例
這篇文章主要介紹了asp.net(C#)實(shí)現(xiàn)功能強(qiáng)大的時間日期處理類,封裝了針對日期與時間的各種常用的判斷與計(jì)算功能,非常方便實(shí)用,需要的朋友可以參考下2016-06-06
ASP.NET Core Zero使用Power Tool工具
這篇文章介紹了ASP.NET Core Zero使用Power Tool工具的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
asp.net得到本機(jī)數(shù)據(jù)庫實(shí)例的兩種方法代碼
這篇文章介紹了asp.net得到本機(jī)數(shù)據(jù)庫實(shí)例的兩種方法代碼,有需要的朋友可以參考一下2013-07-07
gridview+objectdatasource+aspnetpager整合實(shí)例
gridview+objectdatasource+aspnetpager整合實(shí)例,需要的朋友可以參考一下2013-04-04
ASP.NET編程中經(jīng)常用到的27個函數(shù)集
asp.net 整理的27個函數(shù)集,大家可以參考下2008-08-08
ASP.NET自定義Web服務(wù)器控件之Button控件
這篇文章主要介紹了ASP.NET自定義Web服務(wù)器控件之Button控件,詳細(xì)講述了Button控件的實(shí)現(xiàn)代碼、前臺頁面的調(diào)用以及對應(yīng)的事件響應(yīng)代碼,具有很好的參考借鑒價值,需要的朋友可以參考下2014-11-11

