C#單例模式Singleton的實(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)鍵字的作用及其用法
global 是 C# 2.0 中新增的關(guān)鍵字,理論上說(shuō),如果代碼寫(xiě)得好的話(huà),根本不需要用到它,但是不排除一些特別的情況,比如修改別人的代碼,本文僅舉例說(shuō)明。2016-03-03C#引用類(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-09C#條件編譯、內(nèi)聯(lián)函數(shù)、CLS介紹
這篇文章介紹了C#的條件編譯、內(nèi)聯(lián)函數(shù)、CLS,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03