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

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、什么是單例模式

一句話(huà)解釋?zhuān)?/strong>

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

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

這種模式涉及到一個(gè)單一的類(lèi),該類(lèi)負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有一個(gè)對(duì)象被創(chuàng)建。這個(gè)類(lèi)提供了一種訪(fǎng)問(wèn)其唯一的對(duì)象的方式,可以直接訪(fǎng)問(wèn),不需要實(shí)例化該類(lèi)的對(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)銷(xiāo),也避免了對(duì)象高頻創(chuàng)建帶來(lái)的性能損耗。
  • 缺點(diǎn):任務(wù)量大時(shí),會(huì)出現(xiàn)排隊(duì),耗時(shí)增加。另外與單一職責(zé)原則沖突,一個(gè)類(lèi)應(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) // 線(xiàn)程同步鎖
                {
                    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) // 線(xiàn)程同步鎖
            {
                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#中g(shù)lobal關(guān)鍵字的作用及其用法

    在C#中g(shù)lobal關(guān)鍵字的作用及其用法

    global 是 C# 2.0 中新增的關(guān)鍵字,理論上說(shuō),如果代碼寫(xiě)得好的話(huà),根本不需要用到它,但是不排除一些特別的情況,比如修改別人的代碼,本文僅舉例說(shuō)明。
    2016-03-03
  • C#引用類(lèi)型轉(zhuǎn)換的常見(jiàn)方式總結(jié)

    C#引用類(lèi)型轉(zhuǎn)換的常見(jiàn)方式總結(jié)

    這篇文章主要介紹了C#引用類(lèi)型轉(zhuǎn)換的常見(jiàn)方式,包括子類(lèi)轉(zhuǎn)換成父類(lèi),父類(lèi)轉(zhuǎn)換成子類(lèi),以及不是子父級(jí)關(guān)系類(lèi)之間的轉(zhuǎn)換,需要的朋友可以參考下
    2014-09-09
  • C#實(shí)現(xiàn)計(jì)算器窗體程序

    C#實(shí)現(xiàn)計(jì)算器窗體程序

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)計(jì)算器窗體程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#使用瀏覽按鈕獲得文件路徑和文件夾路徑的方法

    C#使用瀏覽按鈕獲得文件路徑和文件夾路徑的方法

    這篇文章主要介紹了C#使用瀏覽按鈕獲得文件路徑和文件夾路徑的方法,結(jié)合實(shí)例形式分析了C#瀏覽器事件響應(yīng)及文件操作相關(guān)技巧,需要的朋友可以參考下
    2017-05-05
  • Unity實(shí)現(xiàn)彈球打磚塊游戲

    Unity實(shí)現(xiàn)彈球打磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)彈球打磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C#操作Word打印的示例

    C#操作Word打印的示例

    這篇文章主要介紹了C#操作Word打印的示例,幫助大家利用c#打印文件,提高辦公效率,感興趣的朋友可以了解下
    2020-10-10
  • C#讀寫(xiě)txt文件的2種方法

    C#讀寫(xiě)txt文件的2種方法

    這篇文章主要為大家詳細(xì)介紹了C#讀寫(xiě)txt文本文檔數(shù)據(jù)的2種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • C#中登錄窗體和歡迎窗體關(guān)閉方法分析

    C#中登錄窗體和歡迎窗體關(guān)閉方法分析

    這篇文章主要介紹了C#中登錄窗體和歡迎窗體關(guān)閉方法,實(shí)例分析了C#中登錄窗體和歡迎窗體關(guān)閉時(shí)出現(xiàn)錯(cuò)誤的原因與解決方法,是C#項(xiàng)目開(kāi)發(fā)中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • C#中的匿名方法實(shí)例解析

    C#中的匿名方法實(shí)例解析

    這篇文章主要介紹了C#中的匿名方法,包括其由來(lái)、定義及用法等,需要的朋友可以參考下
    2014-09-09
  • C#條件編譯、內(nèi)聯(lián)函數(shù)、CLS介紹

    C#條件編譯、內(nèi)聯(lián)函數(shù)、CLS介紹

    這篇文章介紹了C#的條件編譯、內(nèi)聯(lián)函數(shù)、CLS,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論