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

C#設(shè)計(jì)模式之單例模式

 更新時(shí)間:2022年03月07日 10:49:01   作者:.NET開發(fā)菜鳥  
這篇文章介紹了C#設(shè)計(jì)模式之單例模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

單例模式也是創(chuàng)建型模式的一種,也是23種設(shè)計(jì)模式中比較簡單的一種。見名思意,在整個(gè)軟件系統(tǒng)中,只有某個(gè)類型的一個(gè)對象,并且訪問他的地方也只有一個(gè),也就是只有一個(gè)全局對象訪問點(diǎn),這個(gè)實(shí)例或?qū)ο蟊凰惺菓?yīng)用程序所共享;很多可以使用到這樣的功能模塊:比如數(shù)據(jù)庫連接池對象、打印機(jī)對象,因?yàn)檎麄€(gè)系統(tǒng)中,數(shù)據(jù)庫的連接只在一個(gè)地方連接,打印機(jī)在整個(gè)系統(tǒng)中也只有一個(gè)。這種情況下,單例模式就很大的減少了一個(gè)內(nèi)存的開銷,因?yàn)閷ο蟮膭?chuàng)建是比較消耗內(nèi)存的,同時(shí)因?yàn)橄到y(tǒng)中只有一個(gè)實(shí)例,比較容易控制,省去了對象創(chuàng)建的過程,更快的進(jìn)行一個(gè)響應(yīng),但是在使用單例模式時(shí),由于只有一個(gè)實(shí)例,所有的線程都可以去使用這個(gè)實(shí)例,那么不能保證線程的一個(gè)安全性,如果要想保證線程的安全性,我們需要使用其他的一些輔助措施。所以對于線程安全的對象我們最好不要使用單例模式,否則可能會(huì)降低系統(tǒng)的效率。單例模式只需要一個(gè)類就可以實(shí)現(xiàn),自己關(guān)聯(lián)自己,那么如何實(shí)現(xiàn)呢?我們只需要將構(gòu)造方法定義成私有的,這樣用戶就不能自己去創(chuàng)建這個(gè)對象了,然后通過一個(gè)靜態(tài)方法和靜態(tài)變量來存放類的唯一的一個(gè)實(shí)例。

示例:

創(chuàng)建單例類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 單例模式
{
   public  class Singleton
    {
       /// <summary>
       /// 1.定義一個(gè)私有的構(gòu)造函數(shù),在類的外部不能被調(diào)用
       /// </summary>
       private Singleton()
       {
           Console.WriteLine("我被創(chuàng)建了!");
       }

       // 2.創(chuàng)建該類的一個(gè)靜態(tài)變量
       private stati
       c Singleton Instance;
       // 3.創(chuàng)建返回值為該類型的一個(gè)靜態(tài)方法 (此方法對外公開)
       public static Singleton CreateInstance()
       {
           if (Instance == null)
           {
               Instance = new Singleton();
           }
           return Instance;
       }
    }
}

主程序調(diào)用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 單例模式
{
    class Program
    {
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.CreateInstance();
            Singleton s2 = Singleton.CreateInstance();

            Console.ReadKey();
        }
    }
}

運(yùn)行結(jié)果:

從最后的結(jié)果中可以看出,實(shí)例只被創(chuàng)建了一次。

在來看看下面的例子:

for (int i = 0; i < 10; i++)
{
        // 執(zhí)行委托的異步調(diào)用
        new Action(() =>
        {
            Singleton singleton = Singleton.CreateInstance();
        }).BeginInvoke(null,null);
}

結(jié)果:

從上面的截圖中看出構(gòu)造函數(shù)被執(zhí)行了三次。單例模式不是只會(huì)構(gòu)造一次嗎?這里為什么執(zhí)行了三次呢?因?yàn)檫@里是多線程并發(fā)的,10個(gè)任務(wù)是同時(shí)開始的,可能對象不為null的時(shí)候有多個(gè)線程進(jìn)入了,所以會(huì)執(zhí)行多次。要解決這種問題,可以使用加鎖。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 單例模式
{
   public  class Singleton
    {
       /// <summary>
       /// 1.定義一個(gè)私有的構(gòu)造函數(shù),在類的外部不能被調(diào)用
       /// </summary>
       private Singleton()
       {
           Console.WriteLine("我被創(chuàng)建了!");
       }

       // 2.創(chuàng)建該類的一個(gè)靜態(tài)變量
       private static Singleton Instance;
        // 創(chuàng)建鎖
        private static object Singleton_Lock = new object();

       // 3.創(chuàng)建返回值為該類型的一個(gè)靜態(tài)方法 (此方法對外公開)
       public static Singleton CreateInstance()
       {
            lock(Singleton_Lock) // 保證任意時(shí)刻只有一個(gè)線程才能進(jìn)入判斷
            {
                if (Instance == null)
                {
                    Instance = new Singleton();
                }
            }
           return Instance;
       }
    }
}

再次運(yùn)行程序查看結(jié)果:

這時(shí)只會(huì)構(gòu)造一個(gè)對象了。

在來看看懶漢式的單例模式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 單例模式
{
    public class SingletonSecond
    {
        private SingletonSecond()
        {
            Console.WriteLine("我被創(chuàng)建了!");
        }

        private static SingletonSecond Instance = null;

        /// <summary>
        /// 靜態(tài)構(gòu)造函數(shù):由CLR保證在第一次使用這個(gè)類之前,調(diào)用而且只調(diào)用一次
        /// </summary>
        static SingletonSecond()
        {
            Instance = new SingletonSecond();
        }

        public static SingletonSecond CreateInstance()
        {
            return Instance;
        }
    }
}

在來看看第三種寫法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 單例模式
{
    public class SingletonThird
    {
        private SingletonThird()
        {
            Console.WriteLine("我被創(chuàng)建了!");
        }

        /// <summary>
        /// 靜態(tài)變量:會(huì)在類型第一次使用的時(shí)候初始化,而且只初始化一次
        /// </summary>
        private static SingletonThird Instance = new SingletonThird();

        public static SingletonThird CreateInstance()
        {
            return Instance;
        }
    }
}

代碼下載地址:點(diǎn)擊下載

到此這篇關(guān)于C#設(shè)計(jì)模式之單例模式的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#設(shè)置Word文檔背景的三種方法(純色/漸變/圖片背景)

    C#設(shè)置Word文檔背景的三種方法(純色/漸變/圖片背景)

    本文給大家分享三種添加Word文檔背景的方法,非常不錯(cuò),代碼簡單易懂,具有參考借鑒價(jià)值,需要的朋友參考下吧
    2018-03-03
  • C# 后臺(tái)處理圖片的幾種方法

    C# 后臺(tái)處理圖片的幾種方法

    本篇文章主要介紹了C# 后臺(tái)處理圖片的幾種方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-10-10
  • C#中實(shí)現(xiàn)登錄功能的完整步驟

    C#中實(shí)現(xiàn)登錄功能的完整步驟

    這篇文章主要給大家介紹了關(guān)于C#中實(shí)現(xiàn)登錄功能的相關(guān)資料,我們在使用C#做項(xiàng)目的時(shí)候,基本上都需要制作登錄界面,需要的朋友可以參考下
    2021-06-06
  • C#在Windows上調(diào)用7-zip實(shí)現(xiàn)壓縮文件

    C#在Windows上調(diào)用7-zip實(shí)現(xiàn)壓縮文件

    這篇文章主要為大家詳細(xì)介紹了C#如何在Windows上調(diào)用7-zip實(shí)現(xiàn)壓縮文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以學(xué)習(xí)一下
    2023-10-10
  • C#字符串自增自減算法詳解

    C#字符串自增自減算法詳解

    這篇文章主要為大家詳細(xì)介紹了C#字符串自增自減的算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • String.Format大全(C# Java)

    String.Format大全(C# Java)

    String.format無論是在C#中還是在java中應(yīng)用都非常廣泛,今天小編抽個(gè)時(shí)間把有關(guān)string.format知識(shí)總結(jié)分享給大家,需要的朋友可以參考下
    2015-09-09
  • C#實(shí)現(xiàn)獲取一年中是第幾個(gè)星期的方法

    C#實(shí)現(xiàn)獲取一年中是第幾個(gè)星期的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)獲取一年中是第幾個(gè)星期的方法,比較實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • C# WinForms中實(shí)現(xiàn)MD5的加密

    C# WinForms中實(shí)現(xiàn)MD5的加密

    MD5(消息摘要算法第5版)是一種廣泛使用的哈希函數(shù),可以生成一個(gè)128位(16字節(jié))的哈希值,通常用于數(shù)據(jù)完整性校驗(yàn)和密碼存儲(chǔ),在Windows Forms應(yīng)用程序中實(shí)現(xiàn)MD5加密,可以用于用戶密碼的安全存儲(chǔ)和數(shù)據(jù)的完整性驗(yàn)證,本文將詳細(xì)介紹了如何在WinForms中實(shí)現(xiàn)MD5加密
    2024-10-10
  • C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法

    C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法

    這篇文章主要介紹了C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下
    2020-06-06
  • C#簡單讀取、改變文件的創(chuàng)建、修改及訪問時(shí)間的方法

    C#簡單讀取、改變文件的創(chuàng)建、修改及訪問時(shí)間的方法

    這篇文章主要介紹了C#簡單讀取、改變文件的創(chuàng)建、修改及訪問時(shí)間的方法,涉及C#文件類SetCreationTime、SetLastWriteTime及SetLastAccessTime的相關(guān)使用技巧,需要的朋友可以參考下
    2015-07-07

最新評論

渭源县| 古交市| 定襄县| 新安县| 南和县| 嵩明县| 永泰县| 洪洞县| 巨野县| 达尔| 贺州市| 阿瓦提县| 云南省| 屏东市| 东阿县| 江山市| 衡阳县| 温州市| 贵南县| 若尔盖县| 深泽县| 茶陵县| 罗平县| 西华县| 北辰区| 纳雍县| 香格里拉县| 灵宝市| 巴林右旗| 偃师市| 黑龙江省| 兴安县| 广饶县| 江阴市| 杭锦旗| 烟台市| 砚山县| 米易县| 贵阳市| 南陵县| 淮安市|