C#設計模式-單例模式

前言

最近開始花點心思研究下設計模式,主要仍是讓本身寫的代碼可重用性高、保證代碼可靠性。所謂設計模式,我找了下定義:是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結。毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使代碼編制真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結構同樣。設計模式

爲何要提倡「Design Pattern(設計模式)」?多線程

根本緣由是爲了代碼複用,增長可維護性。所以此次咱們來學習下設計模式,最後會經過C#語言來實現這些設計模式做爲例子,深入理解其中的精髓。asp.net

定義

單例模式是一種經常使用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例類的特殊類。經過單例模式能夠保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。若是但願在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。函數

特色學習

      1。 某個類只能有一個實例spa

       2。 它必須自行建立這個實例操作系統

      3。它必須自行向整個系統提供這個實例。.net

 

優缺點

優勢:

1、實例控制線程

單例模式會阻止其餘對象實例化其本身的單例對象的副本,從而確保全部對象都訪問惟一實例。設計

2、靈活性

由於類控制了實例化過程,因此類能夠靈活更改實例化過程。

缺點:

1、開銷

雖然數量不多,但若是每次對象請求引用時都要檢查是否存在類的實例,將仍然須要一些開銷。能夠經過使用靜態初始化解決此問題。

2、可能的開發混淆

使用單例對象(尤爲在類庫中定義的對象)時,開發人員必須記住本身不能使用new關鍵字實例化對象。由於可能沒法訪問庫源代碼,所以應用程序開發人員可能會意外發現本身沒法直接實例化此類。

3、對象生存期

不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基於.NET Framework的語言),只有單例類可以致使實例被取消分配,由於它包含對該實例的私有引用。在某些語言中(如 C++),其餘類能夠刪除對象實例,但這樣會致使單例類中出現懸浮引用。

 

/// <summary>
    /// 單例模式
    /// </summary>
    public class Singleton
    {
        // 定義一個靜態變量來保存類的實例
        private static Singleton mySingleton;



        // 定義私有構造函數,使外界不能建立該類實例
        private Singleton()
        {
        }

        //定義公有方法提供一個全局訪問點。
        public static Singleton GetInstance()
        {
            //這裏的lock其實使用的原理能夠用一個詞語來歸納「互斥」這個概念也是操做系統的精髓
            //其實就是當一個進程進來訪問的時候,其餘進程便先掛起狀態
            if (mySingleton == null)
            {
                mySingleton = new Singleton();
            }
            return mySingleton;
        }
    }

上面的單例模式的實現是有問題的,當多個用戶或者方法同時訪問的時候,便會出現多個用戶同時拿到了mySingleton==null的結果,這個明顯不是咱們想要的,所以,咱們應該經過一個鎖來互斥這個方法,當不少線程同時訪問的時候,只容許一個線程進入到代碼中執行,而其餘的便只能處於掛起的狀態。

/// <summary>
    /// 單例模式
    /// </summary>
    public class Singleton
    {
        // 定義一個靜態變量來保存類的實例
        private static Singleton mySingleton;

        // 定義一個標識確保線程同步
        private static readonly object locker = new object();


        // 定義私有構造函數,使外界不能建立該類實例
        private Singleton()
        {
        }

        //定義公有方法提供一個全局訪問點。
        public static Singleton GetInstance()
        {
            //這裏的lock其實使用的原理能夠用一個詞語來歸納「互斥」這個概念也是操做系統的精髓
            //其實就是當一個進程進來訪問的時候,其餘進程便先掛起狀態
            if (mySingleton == null)//區別就在這裏
            {
                lock (locker)
                {
                    // 若是類的實例不存在則建立,不然直接返回
                    if (mySingleton == null)
                    {
                        mySingleton = new Singleton();
                    }
                }
            }
            return mySingleton;
        }
    }

其實在一些項目中,單例模式早就有了體現。在開發asp.net的項目中,就已經用這種方法來包裝http上下文來實現計算機資源的節省。

/// <summary>
        /// 業務倉儲
        /// </summary>
        public IBLL.IBLLSession BLLSession;

        //---------------------定義上下文屬性
        #region 實例構造函數 初始化業務倉儲 + OperateContext()
        public OperateContext()
        {
            BLLSession = DI.SpringHelper.GetObject<IBLL.IBLLSession>("BLLSession");
        } 
        #endregion

        #region Http上下文 以及相關屬性 
        /// <summary>
        /// Http上下文
        /// </summary>
        HttpContext ContextHttp
        {
            get
            {
                return HttpContext.Current;
            }
        }

        HttpResponse Response
        {
            get
            {
                return ContextHttp.Response;
            }
        }
        HttpRequest Request
        {
            get
            {
                return ContextHttp.Request;
            }
        }
        HttpSessionState Session
        {
            get
            {
                return ContextHttp.Session;
            }
        }
        #endregion

        #region 獲取當前操做上下文(存在線程中,提升效率) + OperateContext Current
        // <summary>
        /// 獲取當前操做上下文(存在線程中,提升效率)
        /// </summary>
        public static OperateContext Current
        {
            get
            {
                OperateContext o = CallContext.GetData(typeof(OperateContext).Name) as OperateContext;
                if (o == null)
                {
                    o = new OperateContext();
                    CallContext.SetData(typeof(OperateContext).Name, o);
                }
                return o;
            }
        } 
        #endregion

總結

      到這裏,就和你們一塊兒先了解了單例模式究竟是個什麼東西,其實在一些項目中,這種模式就已經應用了,只是咱們沒有去發現和總結,不過原本設計模式就是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結。哎。。。。此次是第二次編輯了,原本這個單例模式已經發布了好多天,居然被我新的一篇觀察者模式給覆蓋了,數據取不回來,只能匆匆完稿,你們見諒啊,有問題咱們一塊兒來討論,畢竟我也是初學者。

相關文章
相關標籤/搜索