C# 設(shè)計(jì)模式之單例模式歸納總結(jié)
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
一、實(shí)例控制
單例模式會(huì)阻止其他對(duì)象實(shí)例化其自己的單例對(duì)象的副本,從而確保所有對(duì)象都訪問(wèn)唯一實(shí)例。
二、靈活性
因?yàn)轭惪刂屏藢?shí)例化過(guò)程,所以類可以靈活更改實(shí)例化過(guò)程。
缺點(diǎn):
一、開銷
雖然數(shù)量很少,但如果每次對(duì)象請(qǐng)求引用時(shí)都要檢查是否存在類的實(shí)例,將仍然需要一些開銷??梢酝ㄟ^(guò)使用靜態(tài)初始化解決此問(wèn)題。
二、可能的開發(fā)混淆
使用單例對(duì)象(尤其在類庫(kù)中定義的對(duì)象)時(shí),開發(fā)人員必須記住自己不能使用new關(guān)鍵字實(shí)例化對(duì)象。因?yàn)榭赡軣o(wú)法訪問(wèn)庫(kù)源代碼,因此應(yīng)用程序開發(fā)人員可能會(huì)意外發(fā)現(xiàn)自己無(wú)法直接實(shí)例化此類。
三、對(duì)象生存期
不能解決刪除單個(gè)對(duì)象的問(wèn)題。在提供內(nèi)存管理的語(yǔ)言中(例如基于.NET Framework的語(yǔ)言),只有單例類能夠?qū)е聦?shí)例被取消分配,因?yàn)樗瑢?duì)該實(shí)例的私有引用。在某些語(yǔ)言中(如 C++),其他類可以刪除對(duì)象實(shí)例,但這樣會(huì)導(dǎo)致單例類中出現(xiàn)懸浮引用
C#
保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問(wèn)它的全局訪問(wèn)點(diǎn)
實(shí)現(xiàn)要點(diǎn)
Singleton模式是限制而不是改進(jìn)類的創(chuàng)建。
Singleton類中的實(shí)例構(gòu)造器可以設(shè)置為Protected以允許子類派生。
Singleton模式一般不要支持Icloneable接口,因?yàn)檫@可能導(dǎo)致多個(gè)對(duì)象實(shí)例,與Singleton模式的初衷違背。
Singleton模式一般不要支持序列化,這也有可能導(dǎo)致多個(gè)對(duì)象實(shí)例,這也與Singleton模式的初衷違背。
Singleton只考慮了對(duì)象創(chuàng)建的管理,沒(méi)有考慮到銷毀的管理,就支持垃圾回收的平臺(tái)和對(duì)象的開銷來(lái)講,我們一般沒(méi)必要對(duì)其銷毀進(jìn)行特殊的管理。
理解和擴(kuò)展Singleton模式的核心是"如何控制用戶使用new對(duì)一個(gè)類的構(gòu)造器的任意調(diào)用"。
可以很簡(jiǎn)單的修改一個(gè)Singleton,使它有少數(shù)幾個(gè)實(shí)例,這樣做是允許的而且是有意義的。
優(yōu)點(diǎn)
實(shí)例控制:Singleton 會(huì)阻止其他對(duì)象實(shí)例化其自己的 Singleton 對(duì)象的副本,從而確保所有對(duì)象都訪問(wèn)唯一實(shí)例
靈活性:因?yàn)轭惪刂屏藢?shí)例化過(guò)程,所以類可以更加靈活修改實(shí)例化過(guò)程
缺點(diǎn)
開銷:雖然數(shù)量很少,但如果每次對(duì)象請(qǐng)求引用時(shí)都要檢查是否存在類的實(shí)例,將仍然需要一些開銷??梢酝ㄟ^(guò)使用靜態(tài)初始化解決此問(wèn)題,上面的五種實(shí)現(xiàn)方式中已經(jīng)說(shuō)過(guò)了。
可能的開發(fā)混淆:使用 singleton 對(duì)象(尤其在類庫(kù)中定義的對(duì)象)時(shí),開發(fā)人員必須記住自己不能使用 new 關(guān)鍵字實(shí)例化對(duì)象。因?yàn)榭赡軣o(wú)法訪問(wèn)庫(kù)源代碼,因此應(yīng)用程序開發(fā)人員可能會(huì)意外發(fā)現(xiàn)自己無(wú)法直接實(shí)例化此類。
對(duì)象的生存期:Singleton 不能解決刪除單個(gè)對(duì)象的問(wèn)題。在提供內(nèi)存管理的語(yǔ)言中(例如基于 .NET Framework 的語(yǔ)言),只有 Singleton 類能夠?qū)е聦?shí)例被取消分配,因?yàn)樗瑢?duì)該實(shí)例的私有引用。在某些語(yǔ)言中(如 C++),其他類可以刪除
對(duì)象實(shí)例,但這樣會(huì)導(dǎo)致 Singleton 類中出現(xiàn)懸浮引用。
適用性
當(dāng)類只能有一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問(wèn)點(diǎn)訪問(wèn)它時(shí)。
當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過(guò)子類化可擴(kuò)展的,并且客戶應(yīng)該無(wú)需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。
代碼示例:
雙重鎖機(jī)制
namespace Singleton
{
public class Singleton
{
//定義一個(gè)私有的靜態(tài)全局變量來(lái)保存該類的唯一實(shí)例
private static Singleton singleton;
//定義一個(gè)只讀靜態(tài)對(duì)象
//且這個(gè)對(duì)象是在程序運(yùn)行時(shí)創(chuàng)建的
private static readonly object syncObject = new object();
///
/// 構(gòu)造函數(shù)必須是私有的
/// 這樣在外部便無(wú)法使用 new 來(lái)創(chuàng)建該類的實(shí)例
///
private Singleton()
{}
///
/// 定義一個(gè)全局訪問(wèn)點(diǎn)
/// 設(shè)置為靜態(tài)方法
/// 則在類的外部便無(wú)需實(shí)例化就可以調(diào)用該方法
///
///
public static Singleton GetInstance()
{
//這里可以保證只實(shí)例化一次
//即在第一次調(diào)用時(shí)實(shí)例化
//以后調(diào)用便不會(huì)再實(shí)例化
//第一重 singleton == null
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton == null
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
}
希望本文對(duì)您有所幫助
相關(guān)文章
C#面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)原則
這篇文章介紹了C#面向?qū)ο笤O(shè)計(jì)原則之單一職責(zé)原則,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
C#使用Dns類實(shí)現(xiàn)查詢主機(jī)名對(duì)應(yīng)IP地址
C#中的Dns類能夠與默認(rèn)的DNS服務(wù)器進(jìn)行通信,以檢索IP地址,這篇文章主要介紹了C#如何使用Dns類解析出主機(jī)對(duì)應(yīng)的IP地址信息,需要的可以參考下2024-02-02
C#從foreach語(yǔ)句中枚舉元素看數(shù)組詳解
這篇文章主要給大家介紹了關(guān)于C#從foreach語(yǔ)句中枚舉元素看數(shù)組的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05
Qt讀取本地系統(tǒng)時(shí)間的幾種方式小結(jié)
這篇文章主要介紹了Qt讀取本地系統(tǒng)時(shí)間的幾種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
C#中Invoke和BeginInvoke區(qū)別小結(jié)
有時(shí)候,我們不得不跨線程調(diào)用主界面的控件來(lái)進(jìn)行操作,所以為了方便的解決問(wèn)題,.net為我們提供了Invoke?與beginInvoke,那么Invoke和BeginInvoke區(qū)別在哪,本文就來(lái)詳細(xì)的介紹一下2023-08-08
C#中Thread.CurrentThread的用法小結(jié)
本文主要介紹了C#中Thread.CurrentThread的用法小結(jié),通過(guò)Thread.CurrentThread可以訪問(wèn)和修改當(dāng)前線程的各種屬性和方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-04-04
C#面向?qū)ο筇卣鞯木唧w實(shí)現(xiàn)及作用詳解
所有的面相對(duì)象思想,歸根結(jié)底是為了簡(jiǎn)化代碼,減少代碼量,構(gòu)建更符合現(xiàn)實(shí)生活邏輯的程序代碼,從而減輕程序員的負(fù)擔(dān)。不能一味地或者說(shuō)刻意地去使用面相對(duì)象的思想而忽略了程序所實(shí)現(xiàn)的功能或者框架,要根據(jù)實(shí)際情況2013-10-10
C#調(diào)用Python程序傳參數(shù)獲得返回值
C# 調(diào)用 Python 程序有多種方式,本文主要介紹了4種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

