最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#設(shè)計(jì)模式之單例模式實(shí)例講解

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

前言

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

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

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

定義

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

特點(diǎn)

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

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

一、實(shí)例控制

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

二、靈活性

因?yàn)轭惪刂屏藢?shí)例化過程,所以類可以靈活更改實(shí)例化過程。

缺點(diǎn):

一、開銷

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

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

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

三、對(duì)象生存期

不能解決刪除單個(gè)對(duì)象的問題。在提供內(nèi)存管理的語言中(例如基于.NET Framework的語言),只有單例類能夠?qū)е聦?shí)例被取消分配,因?yàn)樗瑢?duì)該實(shí)例的私有引用。在某些語言中(如 C++),其他類可以刪除對(duì)象實(shí)例,但這樣會(huì)導(dǎo)致單例類中出現(xiàn)懸浮引用。

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

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

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

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

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

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

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

        // 定義一個(gè)標(biāo)識(shí)確保線程同步
        private static readonly object locker = new object();


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

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

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

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

/// <summary>
        /// 業(yè)務(wù)倉(cāng)儲(chǔ)
        /// </summary>
        public IBLL.IBLLSession BLLSession;

        //---------------------定義上下文屬性
        #region 實(shí)例構(gòu)造函數(shù) 初始化業(yè)務(wù)倉(cāng)儲(chǔ) + OperateContext()
        public OperateContext()
        {
            BLLSession = DI.SpringHelper.GetObject<IBLL.IBLLSession>("BLLSession");
        }
        #endregion

        #region Http上下文 以及相關(guān)屬性
        /// <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 獲取當(dāng)前操作上下文(存在線程中,提高效率) + OperateContext Current
        // <summary>
        /// 獲取當(dāng)前操作上下文(存在線程中,提高效率)
        /// </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

總結(jié)

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

相關(guān)文章

  • 一文搞懂c# await,async執(zhí)行流

    一文搞懂c# await,async執(zhí)行流

    這篇文章主要介紹了c# await,async執(zhí)行流的相關(guān)知識(shí),文章講解的非常細(xì)致,代碼幫助理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C# winform分頁查詢的實(shí)現(xiàn)示例

    C# winform分頁查詢的實(shí)現(xiàn)示例

    這篇文章主要介紹了C# winform分頁查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 當(dāng)用戶退出點(diǎn)擊瀏覽器后退仍可回到原來頁面的解決方案

    當(dāng)用戶退出點(diǎn)擊瀏覽器后退仍可回到原來頁面的解決方案

    這篇文章主要介紹了當(dāng)用戶退出點(diǎn)擊瀏覽器后退仍可回到原來頁面的解決方案 的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • C#與js實(shí)現(xiàn)去除textbox文本框里面重復(fù)記錄的方法

    C#與js實(shí)現(xiàn)去除textbox文本框里面重復(fù)記錄的方法

    這篇文章主要介紹了C#與js實(shí)現(xiàn)去除textbox文本框里面重復(fù)記錄的方法,很實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • C#使用NPOI導(dǎo)出Excel類封裝

    C#使用NPOI導(dǎo)出Excel類封裝

    這篇文章主要為大家詳細(xì)介紹了C#使用NPOI導(dǎo)出Excel類封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#異步編程之a(chǎn)sync/await詳解

    C#異步編程之a(chǎn)sync/await詳解

    異步這個(gè)概念在不同語境下有不同的解釋,不同的編程語言有不同異步編程方法,在C#語言中,常常使用async/await等關(guān)鍵字,和Task等類來實(shí)現(xiàn)異步編程。本文就來和大家聊聊async與await吧
    2023-03-03
  • C#多線程系列之原子操作

    C#多線程系列之原子操作

    本文詳細(xì)講解了C#多線程的原子操作,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • c# 解決IIS寫Excel的權(quán)限問題

    c# 解決IIS寫Excel的權(quán)限問題

    使用以上方法必須對(duì)dcom進(jìn)行配置,給用戶使用office的權(quán)限
    2012-10-10
  • C#?漢字與拼音互轉(zhuǎn)的實(shí)現(xiàn)示例

    C#?漢字與拼音互轉(zhuǎn)的實(shí)現(xiàn)示例

    本文主要介紹了C#?漢字與拼音互轉(zhuǎn)的實(shí)現(xiàn)示例,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • c#構(gòu)造初始化的順序淺析

    c#構(gòu)造初始化的順序淺析

    這篇文章介紹了c#構(gòu)造初始化的順序,有需要的朋友可以參考一下
    2013-08-08

最新評(píng)論

靖西县| 长武县| 金塔县| 大方县| 琼结县| 运城市| 东光县| 绥化市| 忻城县| 永福县| 青铜峡市| 临武县| 德令哈市| 福清市| 榆社县| 辰溪县| 商丘市| 北碚区| 和田县| 南充市| 类乌齐县| 佛学| 乡城县| 天门市| 驻马店市| 洛阳市| 甘孜县| 平邑县| 井冈山市| 海丰县| 天津市| 皋兰县| 胶州市| 隆昌县| 吉木乃县| 南华县| 英德市| 德庆县| 阿坝县| 巴马| 沧源|