久久综合丝袜日本网手机版,日韩欧美中文字幕在线三区,亚洲精品国产品国语在线,极品在线观看视频婷婷

      <small id="aebxz"><menu id="aebxz"></menu></small>
    1. C#設(shè)計中單例模式實例講解

      時間:2022-06-29 06:25:22 設(shè)計 我要投稿
      • 相關(guān)推薦

      C#設(shè)計中單例模式實例講解

        前言

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

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

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

        定義

        單例模式是一種常用的軟件設(shè)計模式。在它的核心結(jié)構(gòu)中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(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關(guān)鍵字實例化對象。因為可能無法訪問庫源代碼,因此應(yīng)用程序開發(fā)人員可能會意外發(fā)現(xiàn)自己無法直接實例化此類。

        三、對象生存期

        不能解決刪除單個對象的問題。在提供內(nèi)存管理的語言中(例如基于.NET Framework的語言),只有單例類能夠?qū)е聦嵗蝗∠峙,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實例,但這樣會導(dǎo)致單例類中出現(xiàn)懸浮引用。

        復(fù)制代碼 代碼如下:

        ///

        /// 單例模式

        ///

        public class Singleton

        {

        // 定義一個靜態(tài)變量來保存類的實例

        private static Singleton mySingleton;

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

        private Singleton()

        {

        }

        //定義公有方法提供一個全局訪問點。

        public static Singleton GetInstance()

        {

        //這里的lock其實使用的原理可以用一個詞語來概括“互斥”這個概念也是操作系統(tǒng)的精髓

        //其實就是當(dāng)一個進程進來訪問的時候,其他進程便先掛起狀態(tài)

        if (mySingleton == null)

        {

        mySingleton = new Singleton();

        }

        return mySingleton;

        }

        }

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

        復(fù)制代碼 代碼如下:

        ///

        /// 單例模式

        ///

        public class Singleton

        {

        // 定義一個靜態(tài)變量來保存類的實例

        private static Singleton mySingleton;

        // 定義一個標(biāo)識確保線程同步

        private static readonly object locker = new object();

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

        private Singleton()

        {

        }

        //定義公有方法提供一個全局訪問點。

        public static Singleton GetInstance()

        {

        //這里的lock其實使用的原理可以用一個詞語來概括“互斥”這個概念也是操作系統(tǒng)的精髓

        //其實就是當(dā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é)省。

        復(fù)制代碼 代碼如下:

        ///

        /// 業(yè)務(wù)倉儲

        ///

        public IBLL.IBLLSession BLLSession;

        //---------------------定義上下文屬性

        #region 實例構(gòu)造函數(shù) 初始化業(yè)務(wù)倉儲 + OperateContext()

        public OperateContext()

        {

        BLLSession = DI.SpringHelper.GetObject("BLLSession");

        }

        #endregion

        #region Http上下文 以及相關(guān)屬性

        ///

        /// Http上下文

        ///

        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 獲取當(dāng)前操作上下文(存在線程中,提高效率) + OperateContext Current

        //

        /// 獲取當(dāng)前操作上下文(存在線程中,提高效率)

        ///

        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

        總結(jié)

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

      【C#設(shè)計中單例模式實例講解】相關(guān)文章:

      六級考試寫作實例講解:話劇07-02

      語文閱讀教學(xué)模式講解07-02

      華為路由器配置實例詳細(xì)備注講解07-11

      四個實例講解面試自我介紹07-13

      LOGO字體設(shè)計實例07-14

      從零開始學(xué)攝影,實例講解巧用延時自拍07-09

      飛機方案設(shè)計實例07-03

      抽樣方案設(shè)計實例07-03

      觀察中的發(fā)現(xiàn)教材講解07-02

      古詩講解教學(xué)設(shè)計07-03