雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

C#教程

當(dāng)前位置:主頁 > 軟件編程 > C#教程 >

C# 設(shè)計(jì)模式之單例模式歸納總結(jié)

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C#教程|點(diǎn)擊:

優(yōu)缺點(diǎn)

 優(yōu)點(diǎn):

一、實(shí)例控制

單例模式會阻止其他對象實(shí)例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實(shí)例。

二、靈活性

因?yàn)轭惪刂屏藢?shí)例化過程,所以類可以靈活更改實(shí)例化過程。

缺點(diǎn):

一、開銷

雖然數(shù)量很少,但如果每次對象請求引用時(shí)都要檢查是否存在類的實(shí)例,將仍然需要一些開銷??梢酝ㄟ^使用靜態(tài)初始化解決此問題。

二、可能的開發(fā)混淆

使用單例對象(尤其在類庫中定義的對象)時(shí),開發(fā)人員必須記住自己不能使用new關(guān)鍵字實(shí)例化對象。因?yàn)榭赡軣o法訪問庫源代碼,因此應(yīng)用程序開發(fā)人員可能會意外發(fā)現(xiàn)自己無法直接實(shí)例化此類。

三、對象生存期

不能解決刪除單個(gè)對象的問題。在提供內(nèi)存管理的語言中(例如基于.NET Framework的語言),只有單例類能夠?qū)е聦?shí)例被取消分配,因?yàn)樗瑢υ搶?shí)例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實(shí)例,但這樣會導(dǎo)致單例類中出現(xiàn)懸浮引用 

C#

保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(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è)對象實(shí)例,與Singleton模式的初衷違背。

Singleton模式一般不要支持序列化,這也有可能導(dǎo)致多個(gè)對象實(shí)例,這也與Singleton模式的初衷違背。

Singleton只考慮了對象創(chuàng)建的管理,沒有考慮到銷毀的管理,就支持垃圾回收的平臺和對象的開銷來講,我們一般沒必要對其銷毀進(jìn)行特殊的管理。

理解和擴(kuò)展Singleton模式的核心是"如何控制用戶使用new對一個(gè)類的構(gòu)造器的任意調(diào)用"。

可以很簡單的修改一個(gè)Singleton,使它有少數(shù)幾個(gè)實(shí)例,這樣做是允許的而且是有意義的。

優(yōu)點(diǎn)

實(shí)例控制:Singleton 會阻止其他對象實(shí)例化其自己的 Singleton 對象的副本,從而確保所有對象都訪問唯一實(shí)例

靈活性:因?yàn)轭惪刂屏藢?shí)例化過程,所以類可以更加靈活修改實(shí)例化過程

缺點(diǎn)

開銷:雖然數(shù)量很少,但如果每次對象請求引用時(shí)都要檢查是否存在類的實(shí)例,將仍然需要一些開銷??梢酝ㄟ^使用靜態(tài)初始化解決此問題,上面的五種實(shí)現(xiàn)方式中已經(jīng)說過了。

可能的開發(fā)混淆:使用 singleton 對象(尤其在類庫中定義的對象)時(shí),開發(fā)人員必須記住自己不能使用 new 關(guān)鍵字實(shí)例化對象。因?yàn)榭赡軣o法訪問庫源代碼,因此應(yīng)用程序開發(fā)人員可能會意外發(fā)現(xiàn)自己無法直接實(shí)例化此類。

對象的生存期:Singleton 不能解決刪除單個(gè)對象的問題。在提供內(nèi)存管理的語言中(例如基于 .NET Framework 的語言),只有 Singleton 類能夠?qū)е聦?shí)例被取消分配,因?yàn)樗瑢υ搶?shí)例的私有引用。在某些語言中(如 C++),其他類可以刪除

對象實(shí)例,但這樣會導(dǎo)致 Singleton 類中出現(xiàn)懸浮引用。

適用性

當(dāng)類只能有一個(gè)實(shí)例而且客戶可以從一個(gè)眾所周知的訪問點(diǎn)訪問它時(shí)。

當(dāng)這個(gè)唯一實(shí)例應(yīng)該是通過子類化可擴(kuò)展的,并且客戶應(yīng)該無需更改代碼就能使用一個(gè)擴(kuò)展的實(shí)例時(shí)。

代碼示例:

雙重鎖機(jī)制

namespace Singleton
{
public class Singleton
{
//定義一個(gè)私有的靜態(tài)全局變量來保存該類的唯一實(shí)例
private static Singleton singleton;
//定義一個(gè)只讀靜態(tài)對象
//且這個(gè)對象是在程序運(yùn)行時(shí)創(chuàng)建的
private static readonly object syncObject = new object();
///
/// 構(gòu)造函數(shù)必須是私有的
/// 這樣在外部便無法使用 new 來創(chuàng)建該類的實(shí)例
///
private Singleton()
{}
///
/// 定義一個(gè)全局訪問點(diǎn)
/// 設(shè)置為靜態(tài)方法
/// 則在類的外部便無需實(shí)例化就可以調(diào)用該方法
///
///
public static Singleton GetInstance()
{
//這里可以保證只實(shí)例化一次
//即在第一次調(diào)用時(shí)實(shí)例化
//以后調(diào)用便不會再實(shí)例化
//第一重 singleton == null
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton == null
if (singleton == null)
{
singleton = new Singleton();
}
}
}
return singleton;
}
}
}

希望本文對您有所幫助

上一篇:C# winform點(diǎn)擊生成二維碼實(shí)例代碼

欄    目:C#教程

下一篇:C#文件下載實(shí)例代碼(適用于各個(gè)瀏覽器)

本文標(biāo)題:C# 設(shè)計(jì)模式之單例模式歸納總結(jié)

本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5776.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有