這期內(nèi)容當中小編將會給大家?guī)碛嘘PC#中怎么實現(xiàn)單例模式,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都做網(wǎng)站、網(wǎng)站制作、永嘉網(wǎng)絡推廣、小程序開發(fā)、永嘉網(wǎng)絡營銷、永嘉企業(yè)策劃、永嘉品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供永嘉建站搭建服務,24小時服務熱線:18982081108,官方網(wǎng)址:jinyejixie.com
單例模式的介紹
2.1、動機(Motivate)
在軟件系統(tǒng)中,經(jīng)常有這樣一些特殊的類,必須保證它們在系統(tǒng)中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。
如何繞過常規(guī)的構(gòu)造器,提供一種機制來保證一個類只有一個實例?
這應該是類設計者的責任,而不是使用者的責任
2.2、意圖(Intent)
保證一個類僅有一個實例,并提供一個該實例的全局訪問點。 --《設計模式GoF》
2.3、結(jié)構(gòu)圖(Structure)
2.4、模式的組成
(1)、單件實例(Singleton):這個模式里面只有一個類型,就是Singleton類型,并且這個類只有一個實例,可以通過Instance()方法獲取該類型的實例。
2.5、單件模式的代碼實現(xiàn)
既然是單實例,肯定會涉及到多線程的問題,我們就一步一步的來寫代碼,我們先看看單線程Singleton模式的實現(xiàn),代碼如下:
私有的實例構(gòu)造器是屏蔽外界的調(diào)用,上面的單例模式的實現(xiàn)在單線程下確實是完美的,也很好的滿足了我們單線程環(huán)境的需求。
單線程單例模式的幾個要點:
(1)、Singleton模式中的實例構(gòu)造器可以設置為protected以允許子類派生。
(2)、Singleton模式一般不要支持ICloneable接口,因為這可能會導致多個對象實例,與Singleton模式的初衷違背。
(3)、Singleton模式一般不要支持序列化,因為這也有可能導致多個對象實例,同樣與Singleton模式的初衷違背。
(4)、Singletom模式只考慮到了對象創(chuàng)建的工作,沒有考慮對象銷毀的工作。為什么這樣做呢,因為Net平臺是支持垃圾回收的,所以我們一般沒有必要對其進行銷毀處理。
(5)、不能應對多線程環(huán)境:在多線程環(huán)境下,使用Singleton模式仍然有可能得到Singleton類的多個實例對象
如果放在多線程環(huán)境下,問題就出來了。因為在兩個線程同時運行GetInstance方法時,此時兩個線程判斷(uniqueInstance ==null)這個條件時都返回真,此時兩個線程就都會創(chuàng)建Singleton的實例,這樣就違背了我們單例模式初衷了。要想解決這個問題,只要讓GetInstance方法在同一時間只運行一個線程運行就好了,讓我們看看多線程Singleton模式的實現(xiàn),代碼如下:
上面這種解決方案確實可以解決多線程的問題,但是上面代碼對于每個線程都會對線程輔助對象locker加鎖之后再判斷實例是否存在,對于這個操作完全沒有必要的,因為當?shù)谝粋€線程創(chuàng)建了該類的實例之后,后面的線程此時只需要直接判斷(uniqueInstance==null)為假,此時完全沒必要對線程輔助對象加鎖之后再去判斷,所以上面的實現(xiàn)方式增加了額外的開銷,損失了性能,為了改進上面實現(xiàn)方式的缺陷,我們只需要在lock語句前面加一句(uniqueInstance==null)的判斷就可以避免鎖所增加的額外開銷,這種實現(xiàn)方式我們就叫它 “雙重鎖定(Double Check)”,下面具體看看實現(xiàn)代碼的:
volatile修飾:編譯器在編譯代碼的時候會對代碼的順序進行微調(diào),用volatile修飾保證了嚴格意義的順序。一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。
三、C#中實現(xiàn)了單例模式的類
現(xiàn)在我們看看,如何使用C#語言的特性來實現(xiàn)單例的Singleton模式。
內(nèi)聯(lián)初始化其實是把靜態(tài)的字段放到靜態(tài)構(gòu)造器去初始化。只要想訪問靜態(tài)字段,必定已經(jīng)在之前執(zhí)行了靜態(tài)構(gòu)造器。這樣也能夠精確地保證使用的時候一定能拿到實例,如果不使用也不會實例化對象,也就是延時加載的功能。他同樣能夠支持多線程環(huán)境,因為只可能有一個線程執(zhí)行靜態(tài)構(gòu)造器,不可能有多個線程去執(zhí)行靜態(tài)構(gòu)造器,感覺就是程序已經(jīng)自動為我們加鎖了。
它的一點弊端就是它不支持參數(shù)化的實例化方法。在.NET里靜態(tài)構(gòu)造器只能聲明一個,而且必須是無參數(shù)的,私有的。因此這種方式只適用于無參數(shù)的構(gòu)造器。
需要說明的是:HttpContext.Current就是一個單例,他們是通過Singleton的擴展方式實現(xiàn)的,他們的單例也并不是覆蓋所有領域,只是針對某些局部領域中,是單例的,不同的領域中還是會有不同的實例。
四、Singleton模式的擴展
(1)、將一個實例擴展到n個實例,例如對象池的實現(xiàn)。(n不是指無限個實例,而是固定的某個數(shù))
(2)、將new構(gòu)造器的調(diào)用轉(zhuǎn)移到其他類中,例如多個類協(xié)同工作環(huán)境中,某個局部環(huán)境只需要擁有某個類的一個實例。
(3)、理解和擴展Singleton模式的核心是“如何控制用戶使用new對一個類的實例構(gòu)造器的任意調(diào)用”。
五、單例模式的實現(xiàn)要點
1、Singleton模式是限制而不是改進類的創(chuàng)建。
2、Singleton類中的實例構(gòu)造器可以設置為Protected以允許子類派生。
3、Singleton模式一般不要支持Icloneable接口,因為這可能導致多個對象實例,與Singleton模式的初衷違背。
4、Singleton模式一般不要支持序列化,這也有可能導致多個對象實例,這也與Singleton模式的初衷違背。
5、Singleton只考慮了對象創(chuàng)建的管理,沒有考慮到銷毀的管理,就支持垃圾回收的平臺和對象的開銷來講,我們一般沒必要對其銷毀進行特殊的管理。
6、理解和擴展Singleton模式的核心是“如何控制用戶使用new對一個類的構(gòu)造器的任意調(diào)用”。
7、可以很簡單的修改一個Singleton,使它有少數(shù)幾個實例,這樣做是允許的而且是有意義的。
1】、單例模式的優(yōu)點:
(1)、實例控制:Singleton 會阻止其他對象實例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實例
(2)、靈活性:因為類控制了實例化過程,所以類可以更加靈活修改實例化過程
2】、單例模式的缺點:
(1)、開銷:雖然數(shù)量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷??梢酝ㄟ^使用靜態(tài)初始化解決此問題。
(2)、可能的開發(fā)混淆:使用 singleton 對象(尤其在類庫中定義的對象)時,開發(fā)人員必須記住自己不能使用 new 關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發(fā)人員可能會意外發(fā)現(xiàn)自己無法直接實例化此類。
(3)、對象的生存期:Singleton 不能解決刪除單個對象的問題。因為它包含對該靜態(tài)的私有字段的引用,靜態(tài)字段是不能被CLR回收內(nèi)存的,該實例會和應用程序生命周期一樣長,一直存在。
3】、單例模式的使用場合:
(1)、當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
(2)、當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。
上述就是小編為大家分享的C#中怎么實現(xiàn)單例模式了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
文章標題:C#中怎么實現(xiàn)單例模式
當前地址:http://jinyejixie.com/article0/ijcpio.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導航、全網(wǎng)營銷推廣、ChatGPT、企業(yè)建站、軟件開發(fā)、App設計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)