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

C#單例模式Singleton的實(shí)現(xiàn)詳解

 更新時(shí)間:2023年05月26日 08:25:24   作者:橙子家  
單例模式(Singleton?Pattern)是日常開(kāi)發(fā)中最簡(jiǎn)單的設(shè)計(jì)模式之一,它提供了一種創(chuàng)建對(duì)象的最佳方式,本文主要為大家介紹的是C#單例模式的實(shí)現(xiàn)方法,需要的可以參考一下

一、簡(jiǎn)介

1、什么是單例模式

一句話解釋:

單一的類,只能自己來(lái)創(chuàng)建唯一的一個(gè)對(duì)象。

單例模式(Singleton Pattern)是日常開(kāi)發(fā)中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。

這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有一個(gè)對(duì)象被創(chuàng)建。這個(gè)類提供了一種訪問(wèn)其唯一的對(duì)象的方式,可以直接訪問(wèn),不需要實(shí)例化該類的對(duì)象。

一個(gè)比喻:(班主任與學(xué)生)

比如一個(gè)班級(jí),只有一個(gè)班主任,任何一個(gè)同學(xué)要找班主任,都是找的同一個(gè),班主任忙的時(shí)候,當(dāng)然就出現(xiàn)排隊(duì)的情況。

2、優(yōu)缺點(diǎn)和使用場(chǎng)景

  • 優(yōu)點(diǎn):內(nèi)存里只有一個(gè)實(shí)例,減少了內(nèi)存的開(kāi)銷,也避免了對(duì)象高頻創(chuàng)建帶來(lái)的性能損耗。
  • 缺點(diǎn):任務(wù)量大時(shí),會(huì)出現(xiàn)排隊(duì),耗時(shí)增加。另外與單一職責(zé)原則沖突,一個(gè)類應(yīng)該只關(guān)心內(nèi)部邏輯,而不關(guān)心外面怎么樣來(lái)實(shí)例化。

 使用場(chǎng)景舉例:

  • 要求生產(chǎn)唯一序列號(hào)。
  • WEB 中的計(jì)數(shù)器,不用每次刷新都在數(shù)據(jù)庫(kù)里加一次,用單例先緩存起來(lái)。
  • 創(chuàng)建的一個(gè)對(duì)象需要消耗的資源過(guò)多,比如 I/O 與數(shù)據(jù)庫(kù)的連接等。

二、單例模式簡(jiǎn)單實(shí)現(xiàn)

public class Singleton
{
    private static Singleton instance = null;
    private static object lockObject = new object();
    /// <summary>
    /// 私有化構(gòu)造函數(shù),防止外部實(shí)例化
    /// </summary>
    private Singleton() { }
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObject) // 線程同步鎖
                {
                    if (instance == null) // Lazy Initialization
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    /// <summary>
    /// 重置 Singleton
    /// </summary>
    public void Reset()
    {
        instance = null;
    }
}

測(cè)試代碼:

static void Main(string[] args)
{
    var instance1 = Singleton.Instance;
    var instance2 = Singleton.Instance;
    Console.WriteLine(instance1 == instance2); // 輸出 true 
}

三、帶參數(shù)的單例模式實(shí)現(xiàn)

public class SingletonParameters
{
    private static SingletonParameters instance = null;
    private static object lockObject = new object();
    private int _firstvalue, _secondvalue;
    /// <summary>
    /// 私有化構(gòu)造函數(shù),防止外部實(shí)例化
    /// </summary>
    private SingletonParameters(int first, int second)
    {
        this._firstvalue = first;
        this._secondvalue = second;
    }
    public static SingletonParameters InstanceParameters(int first, int second)
    {
        if (instance == null)
        {
            lock (lockObject) // 線程同步鎖
            {
                if (instance == null) // Lazy Initialization
                {
                    instance = new SingletonParameters(first, second);
                }
            }
        }
        else
        {
            instance.FirstValue = first;
            instance.SecondValue = second;
        }
        return instance;
    }
    public int FirstValue { get { return _firstvalue; } set { _firstvalue = value; } }
    public int SecondValue { get { return _secondvalue; } set { _secondvalue = value; } }
    /// <summary>
    /// 重置 Singleton
    /// </summary>
    public void Reset()
    {
        instance = null;
    }
}

 測(cè)試代碼:

var instance1 = SingletonParameters.InstanceParameters(1, 2);
Console.WriteLine($"FirstValue:{instance1.FirstValue}");
Console.WriteLine($"SecondValue:{instance1.SecondValue}");
var instance2 = SingletonParameters.InstanceParameters(3, 4);
Console.WriteLine($"FirstValue:{instance2.FirstValue}");
Console.WriteLine($"SecondValue:{instance2.SecondValue}");
Console.WriteLine($"instance1 == instance2 : {instance1 == instance2}");

到此這篇關(guān)于C#單例模式Singleton的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)C#單例模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#封裝的Sqlite訪問(wèn)類實(shí)例

    C#封裝的Sqlite訪問(wèn)類實(shí)例

    這篇文章主要介紹了C#封裝的Sqlite訪問(wèn)類,實(shí)例分析了C#針對(duì)Sqlite數(shù)據(jù)庫(kù)各種常用操作的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • 詳解c# 切片語(yǔ)法糖

    詳解c# 切片語(yǔ)法糖

    這篇文章主要介紹了c# 切片語(yǔ)法糖的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-09-09
  • C#顯式地實(shí)現(xiàn)接口成員的方法

    C#顯式地實(shí)現(xiàn)接口成員的方法

    這篇文章主要介紹了C#顯式地實(shí)現(xiàn)接口成員的方法,實(shí)例分析了C#接口的相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • 關(guān)于C#版Nebula客戶端編譯的問(wèn)題

    關(guān)于C#版Nebula客戶端編譯的問(wèn)題

    這篇文章主要介紹了C#版Nebula客戶端編譯的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • c#求點(diǎn)到直線的投影點(diǎn)坐標(biāo)

    c#求點(diǎn)到直線的投影點(diǎn)坐標(biāo)

    這篇文章主要介紹了c#求直線外一點(diǎn)到該直線的投影點(diǎn),大家參考使用吧
    2013-12-12
  • C#實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能(附源碼)

    C#實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能(附源碼)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C#入門學(xué)習(xí)之集合、比較和轉(zhuǎn)換

    C#入門學(xué)習(xí)之集合、比較和轉(zhuǎn)換

    本文詳細(xì)講解了C#中的集合、比較和轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#實(shí)現(xiàn)解壓GZip文件的方法

    C#實(shí)現(xiàn)解壓GZip文件的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)解壓GZip文件的方法,涉及C#操作壓縮文件的技巧,需要的朋友可以參考下
    2015-05-05
  • 淺談C#中的string駐留池

    淺談C#中的string駐留池

    這篇文章主要介紹了C#中的string駐留池的的相關(guān)資料,文中示例代碼非常細(xì)致,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 少見(jiàn)的C# RSA算法

    少見(jiàn)的C# RSA算法

    這篇文章主要介紹了非常少見(jiàn)的C# RSA算法,文章簡(jiǎn)單易懂,實(shí)例代碼幫助大家更好的學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評(píng)論

鱼台县| 凤山县| 溆浦县| 永年县| 水富县| 丘北县| 井陉县| 横峰县| 赤峰市| 专栏| 宁远县| 宝丰县| 长宁县| 东乡县| 白沙| 连江县| 穆棱市| 且末县| 科技| 南岸区| 温泉县| 西青区| 三穗县| 赤城县| 宁河县| 雅安市| 张家界市| 专栏| 黔东| 汾阳市| 介休市| 温州市| 延吉市| 临汾市| 九台市| 佳木斯市| 云梦县| 花莲县| 奉新县| 石狮市| 抚州市|