C# 設(shè)計(jì)模式之單例模式歸納總結(jié)
優(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
您可能感興趣的文章
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動對資源的釋放
- 01-10深入淺出23種設(shè)計(jì)模式
- 01-10Python設(shè)計(jì)模式編程中的備忘錄模式與對象池模式示例
- 01-10詳解C#的設(shè)計(jì)模式編程之抽象工廠模式的應(yīng)用
- 01-10解析C#設(shè)計(jì)模式編程中的裝飾者模式
- 01-10簡單了解C#設(shè)計(jì)模式編程中的橋接模式
- 01-10C#編程中使用設(shè)計(jì)模式中的原型模式的實(shí)例講解
- 01-10剖析設(shè)計(jì)模式編程中C#對于組合模式的運(yùn)用
- 01-10實(shí)例解析C#設(shè)計(jì)模式編程中簡單工廠模式的使用
- 01-10解析C#設(shè)計(jì)模式編程中適配器模式的實(shí)現(xiàn)


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法


