小編給大家分享一下c#怎樣實現(xiàn)單例模式,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
專業(yè)領域包括成都網(wǎng)站設計、成都網(wǎng)站建設、成都做商城網(wǎng)站、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設計及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結合了幫做網(wǎng)絡品牌建設經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。記一下學習單例模式的筆記:
單例就是要保證該類僅有一個實例。實現(xiàn)完全封閉的單例(外部不能new)其實就要兩點要求:
全局訪問:需要一個該類型的全局靜態(tài)變量,每次獲取實例時都要判斷它是否null,不存在new,存在通過一個方法直接返回該值獲取實例來保證對象;
實例化控制:new實例不能外部new、造成實例不,需要一個私有構造器禁用共有構造器。
根據(jù)new實例的時機,分為餓漢式和懶漢式:
特點:加載時new,一開始全局就存在該實例,每次用到只要獲取就行,提前占用系統(tǒng)資源但不存在線程安全問題。代碼如下:
public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton GetInstance() { return instance; } }
特點:真正需要用到的時候才實例化,不提前占用資源但多個線程同時用到該實例時,會存在判斷靜態(tài)變量都為null都去new而產(chǎn)生多個實例的情況。有線程安全問題,但可以用雙重鎖定解決。
單線程懶漢單例代碼如下:
public class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton GetInstance() { if (instance == null) instance = new Singleton(); return instance; } }
多線程懶漢單例代碼如下:
public class Singleton { private static Singleton instance = null; private static readonly object obj = new object(); private Singleton() { } public static Singleton GetInstance() { //雙重鎖定 if (instance == null)//只有為null需要實例化處理時才進行加鎖,提高性能避免不必要的等待 { lock (obj) { if (instance == null)//避免其他線程等待鎖釋放期間有線程已經(jīng)實例化,從而造成多個實例 instance = new Singleton(); } } return instance; } }
介紹一個有意思的單例-泛型注冊式,是對單例的擴展,主要了解它的設計思想。
其實每個類單例模式實現(xiàn)代碼都是差不多的:
相同結構和成員(字段、屬性、行為等):是否可以考慮進行抽象提取一個公共的調(diào)用接口?
成員類型或輸入輸出具體類型不是固定的:是否可以考慮設計一個適用于不同類型的通用處理方式而不都是Object?這個適用不同類型通用解決就要用到泛型。
實現(xiàn)代碼如下(例子使用餓漢式,當然也可以用懶漢式):
public abstract class Singleton<T> where T:class,new() { private static readonly T instance = new T(); protected Singleton() { } public static T GetSingleton()//獲取單例 { return instance; } } public class Person : Singleton<Person> { }
可以看到這種單例通過繼承的方式,既可以new實例也可以獲取單例實例。如果要實現(xiàn)上面的完全封閉(禁用外部new),也可以完全在Person類中寫個私有構造器在Singleton<T>類中實例的獲取new T()改為反射調(diào)用私有構造器的方式實現(xiàn),總感覺怪怪的。
下面是主程序調(diào)用該單例方法:
static void Main(string[] args) { Person p1 = Person.GetSingleton(); Person p2 = Singleton<Person>.GetSingleton(); if (object.ReferenceEquals(p1, p2)) { Console.WriteLine("兩個對象是同一實例"); } Console.ReadKey(); }
輸出結果:
看完了這篇文章,相信你對“c#怎樣實現(xiàn)單例模式”有了一定的了解,如果想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站標題:c#怎樣實現(xiàn)單例模式-創(chuàng)新互聯(lián)
本文來源:http://jinyejixie.com/article46/dpsshg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、網(wǎng)站策劃、網(wǎng)站收錄、建站公司、App設計、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容