欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#設計模式之單例模式實例講解

 更新時間:2014年10月25日 10:44:03   投稿:junjie  
這篇文章主要介紹了C#設計模式之單例模式實例講解,本文講解了單例模式的定義、單例模式的優(yōu)缺點,需要的朋友可以參考下

前言

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

為什么要提倡“Design Pattern(設計模式)”?

根本原因是為了代碼復用,增加可維護性。因此這次我們來學習下設計模式,最后會通過C#語言來實現(xiàn)這些設計模式作為例子,深刻理解其中的精髓。

定義

單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案。

特點

1、 某個類只能有一個實例
2、它必須自行創(chuàng)建這個實例
3、它必須自行向整個系統(tǒng)提供這個實例。

優(yōu)缺點

優(yōu)點:

一、實例控制

單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。

二、靈活性

因為類控制了實例化過程,所以類可以靈活更改實例化過程。

缺點:

一、開銷

雖然數(shù)量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷??梢酝ㄟ^使用靜態(tài)初始化解決此問題。

二、可能的開發(fā)混淆

使用單例對象(尤其在類庫中定義的對象)時,開發(fā)人員必須記住自己不能使用new關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發(fā)人員可能會意外發(fā)現(xiàn)自己無法直接實例化此類。

三、對象生存期

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

復制代碼 代碼如下:

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

        // 定義私有構造函數(shù),使外界不能創(chuàng)建該類實例
        private Singleton()
        {
        }

        //定義公有方法提供一個全局訪問點。
        public static Singleton GetInstance()
        {
            //這里的lock其實使用的原理可以用一個詞語來概括“互斥”這個概念也是操作系統(tǒng)的精髓
            //其實就是當一個進程進來訪問的時候,其他進程便先掛起狀態(tài)
            if (mySingleton == null)
            {
                mySingleton = new Singleton();
            }
            return mySingleton;
        }
    }

上面的單例模式的實現(xiàn)是有問題的,當多個用戶或者方法同時訪問的時候,便會出現(xiàn)多個用戶同時拿到了mySingleton==null的結果,這個明顯不是我們想要的,因此,我們應該通過一個鎖來互斥這個方法,當很多線程同時訪問的時候,只允許一個線程進入到代碼中執(zhí)行,而其他的便只能處于掛起的狀態(tài)。

復制代碼 代碼如下:

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

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


        // 定義私有構造函數(shù),使外界不能創(chuàng)建該類實例
        private Singleton()
        {
        }

        //定義公有方法提供一個全局訪問點。
        public static Singleton GetInstance()
        {
            //這里的lock其實使用的原理可以用一個詞語來概括“互斥”這個概念也是操作系統(tǒng)的精髓
            //其實就是當一個進程進來訪問的時候,其他進程便先掛起狀態(tài)
            if (mySingleton == null)//區(qū)別就在這里
            {
                lock (locker)
                {
                    // 如果類的實例不存在則創(chuàng)建,否則直接返回
                    if (mySingleton == null)
                    {
                        mySingleton = new Singleton();
                    }
                }
            }
            return mySingleton;
        }
    }

其實在一些項目中,單例模式早就有了體現(xiàn)。在開發(fā)asp.net的項目中,就已經(jīng)用這種方法來包裝http上下文來實現(xiàn)計算機資源的節(jié)省。

復制代碼 代碼如下:

/// <summary>
        /// 業(yè)務倉儲
        /// </summary>
        public IBLL.IBLLSession BLLSession;

        //---------------------定義上下文屬性
        #region 實例構造函數(shù) 初始化業(yè)務倉儲 + 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

總結

到這里,就和大家一起先了解了單例模式到底是個什么東西,其實在一些項目中,這種模式就已經(jīng)應用了,只是我們沒有去發(fā)現(xiàn)和總結,不過本來設計模式就是一套被反復使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設計經(jīng)驗的總結。哎。。。。這次是第二次編輯了,本來這個單例模式已經(jīng)發(fā)布了好多天,竟然被我新的一篇觀察者模式給覆蓋了,數(shù)據(jù)取不回來,只能匆匆完稿,大家見諒啊,有問題我們一起來討論,畢竟我也是初學者。

相關文章

  • C#使用WinRar命令進行壓縮和解壓縮操作的實現(xiàn)方法

    C#使用WinRar命令進行壓縮和解壓縮操作的實現(xiàn)方法

    這篇文章主要介紹了C#使用WinRar命令進行壓縮和解壓縮操作的實現(xiàn)方法,涉及C#基于Process類操作WinRar命令的相關實現(xiàn)技巧,代碼簡潔實用,需要的朋友可以參考下
    2016-06-06
  • c#實現(xiàn)無標題欄窗口的拖動

    c#實現(xiàn)無標題欄窗口的拖動

    本篇文章是對c#中實現(xiàn)無標題欄窗口拖動的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • WPF MVVM示例講解

    WPF MVVM示例講解

    WPF技術的主要特點是數(shù)據(jù)驅動UI,所以在使用WPF技術開發(fā)的過程中是以數(shù)據(jù)為核心的,WPF提供了數(shù)據(jù)綁定機制,當數(shù)據(jù)發(fā)生變化時,WPF會自動發(fā)出通知去更新UI,這篇文章通過示例讓大家體驗下WPF MVM,有需要的朋友可以參考下
    2015-08-08
  • C#實現(xiàn)在控制臺輸出當前系統(tǒng)時間的方法

    C#實現(xiàn)在控制臺輸出當前系統(tǒng)時間的方法

    這篇文章主要介紹了C#實現(xiàn)在控制臺輸出當前系統(tǒng)時間的方法,涉及C#時間函數(shù)DateTime.Now的使用方法,需要的朋友可以參考下
    2015-04-04
  • WinForm實現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能

    WinForm實現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能

    這篇文章主要介紹了WinForm實現(xiàn)為ComboBox綁定數(shù)據(jù)源并提供下拉提示功能,是非常實用的功能,需要的朋友可以參考下
    2014-08-08
  • C#實現(xiàn)電腦麥克風錄音

    C#實現(xiàn)電腦麥克風錄音

    這篇文章主要為大家詳細介紹了C#實現(xiàn)電腦麥克風錄音,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳解C#擴展方法原理及其使用

    詳解C#擴展方法原理及其使用

    這篇文章主要介紹了C#擴展方法原理及其使用的的相關資料,文中代碼非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • C#語言async?await之迭代器工作原理示例解析

    C#語言async?await之迭代器工作原理示例解析

    這篇文章主要為大家介紹了C#語言async?await之迭代器工作原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • C# 實現(xiàn)與現(xiàn)有.NET事件橋接簡單實例

    C# 實現(xiàn)與現(xiàn)有.NET事件橋接簡單實例

    這篇文章主要介紹了C# 實現(xiàn)與現(xiàn)有.NET事件橋接簡單實例的相關資料,需要的朋友可以參考下
    2017-03-03
  • AnyChat的視頻會議程序實例詳解

    AnyChat的視頻會議程序實例詳解

    AnyChat是一款跨平臺的音視頻解決方案。通過本篇文章給大家介紹AnyChat的視頻會議程序,涉及到anychat相關知識,對anychat視頻會議相關知識感興趣的朋友一起學習吧
    2016-01-01

最新評論