- 相關(guān)推薦
C#設計中單例模式實(shí)例講解
前言
最近開(kāi)始花點(diǎn)心思研究下設計模式,主要還是讓自己寫(xiě)的代碼可重用性高、保證代碼可靠性。所謂設計模式,我找了下定義:是一套被反復使用、多數人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設計經(jīng)驗的總結。毫無(wú)疑問(wèn),設計模式于己于他人于系統都是多贏(yíng)的;設計模式使代碼編制真正工程化;設計模式是軟件工程的基石脈絡(luò ),如同大廈的結構一樣。
為什么要提倡“Design Pattern(設計模式)”?
根本原因是為了代碼復用,增加可維護性。因此這次我們來(lái)學(xué)習下設計模式,最后會(huì )通過(guò)C#語(yǔ)言來(lái)實(shí)現這些設計模式作為例子,深刻理解其中的精髓。
定義
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個(gè)被稱(chēng)為單例類(lèi)的特殊類(lèi)。通過(guò)單例模式可以保證系統中一個(gè)類(lèi)只有一個(gè)實(shí)例而且該實(shí)例易于外界訪(fǎng)問(wèn),從而方便對實(shí)例個(gè)數的控制并節約系統資源。如果希望在系統中某個(gè)類(lèi)的對象只能存在一個(gè),單例模式是最好的解決方案。
特點(diǎn)
1、 某個(gè)類(lèi)只能有一個(gè)實(shí)例
2、它必須自行創(chuàng )建這個(gè)實(shí)例
3、它必須自行向整個(gè)系統提供這個(gè)實(shí)例。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
一、實(shí)例控制
單例模式會(huì )阻止其他對象實(shí)例化其自己的單例對象的副本,從而確保所有對象都訪(fǎng)問(wèn)唯一實(shí)例。
二、靈活性
因為類(lèi)控制了實(shí)例化過(guò)程,所以類(lèi)可以靈活更改實(shí)例化過(guò)程。
缺點(diǎn):
一、開(kāi)銷(xiāo)
雖然數量很少,但如果每次對象請求引用時(shí)都要檢查是否存在類(lèi)的實(shí)例,將仍然需要一些開(kāi)銷(xiāo)?梢酝ㄟ^(guò)使用靜態(tài)初始化解決此問(wèn)題。
二、可能的開(kāi)發(fā)混淆
使用單例對象(尤其在類(lèi)庫中定義的對象)時(shí),開(kāi)發(fā)人員必須記住自己不能使用new關(guān)鍵字實(shí)例化對象。因為可能無(wú)法訪(fǎng)問(wèn)庫源代碼,因此應用程序開(kāi)發(fā)人員可能會(huì )意外發(fā)現自己無(wú)法直接實(shí)例化此類(lèi)。
三、對象生存期
不能解決刪除單個(gè)對象的問(wèn)題。在提供內存管理的語(yǔ)言中(例如基于.NET Framework的語(yǔ)言),只有單例類(lèi)能夠導致實(shí)例被取消分配,因為它包含對該實(shí)例的私有引用。在某些語(yǔ)言中(如 C++),其他類(lèi)可以刪除對象實(shí)例,但這樣會(huì )導致單例類(lèi)中出現懸浮引用。
復制代碼 代碼如下:
///
/// 單例模式
///
public class Singleton
{
// 定義一個(gè)靜態(tài)變量來(lái)保存類(lèi)的實(shí)例
private static Singleton mySingleton;
// 定義私有構造函數,使外界不能創(chuàng )建該類(lèi)實(shí)例
private Singleton()
{
}
//定義公有方法提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn)。
public static Singleton GetInstance()
{
//這里的lock其實(shí)使用的原理可以用一個(gè)詞語(yǔ)來(lái)概括“互斥”這個(gè)概念也是操作系統的精髓
//其實(shí)就是當一個(gè)進(jìn)程進(jìn)來(lái)訪(fǎng)問(wèn)的時(shí)候,其他進(jìn)程便先掛起狀態(tài)
if (mySingleton == null)
{
mySingleton = new Singleton();
}
return mySingleton;
}
}
上面的單例模式的實(shí)現是有問(wèn)題的,當多個(gè)用戶(hù)或者方法同時(shí)訪(fǎng)問(wèn)的時(shí)候,便會(huì )出現多個(gè)用戶(hù)同時(shí)拿到了mySingleton==null的結果,這個(gè)明顯不是我們想要的,因此,我們應該通過(guò)一個(gè)鎖來(lái)互斥這個(gè)方法,當很多線(xiàn)程同時(shí)訪(fǎng)問(wèn)的時(shí)候,只允許一個(gè)線(xiàn)程進(jìn)入到代碼中執行,而其他的便只能處于掛起的狀態(tài)。
復制代碼 代碼如下:
///
/// 單例模式
///
public class Singleton
{
// 定義一個(gè)靜態(tài)變量來(lái)保存類(lèi)的實(shí)例
private static Singleton mySingleton;
// 定義一個(gè)標識確保線(xiàn)程同步
private static readonly object locker = new object();
// 定義私有構造函數,使外界不能創(chuàng )建該類(lèi)實(shí)例
private Singleton()
{
}
//定義公有方法提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn)。
public static Singleton GetInstance()
{
//這里的lock其實(shí)使用的原理可以用一個(gè)詞語(yǔ)來(lái)概括“互斥”這個(gè)概念也是操作系統的精髓
//其實(shí)就是當一個(gè)進(jìn)程進(jìn)來(lái)訪(fǎng)問(wèn)的時(shí)候,其他進(jìn)程便先掛起狀態(tài)
if (mySingleton == null)//區別就在這里
{
lock (locker)
{
// 如果類(lèi)的實(shí)例不存在則創(chuàng )建,否則直接返回
if (mySingleton == null)
{
mySingleton = new Singleton();
}
}
}
return mySingleton;
}
}
其實(shí)在一些項目中,單例模式早就有了體現。在開(kāi)發(fā)asp.net的項目中,就已經(jīng)用這種方法來(lái)包裝http上下文來(lái)實(shí)現計算機資源的節省。
復制代碼 代碼如下:
///
/// 業(yè)務(wù)倉儲
///
public IBLL.IBLLSession BLLSession;
//---------------------定義上下文屬性
#region 實(shí)例構造函數 初始化業(yè)務(wù)倉儲 + OperateContext()
public OperateContext()
{
BLLSession = DI.SpringHelper.GetObject
}
#endregion
#region Http上下文 以及相關(guān)屬性
///
/// Http上下文
///
HttpContext ContextHttp
{
get
{
return HttpContext.Current;
}
}
HttpResponse Response
{
get
{
return ContextHttp.Response;
}
}
HttpRequest Request
{
get
{
return ContextHttp.Request;
}
}
HttpSessionState Session
{
get
{
return ContextHttp.Session;
}
}
#endregion
#region 獲取當前操作上下文(存在線(xiàn)程中,提高效率) + OperateContext Current
//
/// 獲取當前操作上下文(存在線(xiàn)程中,提高效率)
///
public static OperateContext Current
{
get
{
OperateContext o = CallContext.GetData(typeof(OperateContext).Name) as OperateContext;
if (o == null)
{
o = new OperateContext();
CallContext.SetData(typeof(OperateContext).Name, o);
}
return o;
}
}
#endregion
總結
到這里,就和大家一起先了解了單例模式到底是個(gè)什么東西,其實(shí)在一些項目中,這種模式就已經(jīng)應用了,只是我們沒(méi)有去發(fā)現和總結,不過(guò)本來(lái)設計模式就是一套被反復使用、多數人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設計經(jīng)驗的總結。哎。。。。這次是第二次編輯了,本來(lái)這個(gè)單例模式已經(jīng)發(fā)布了好多天,竟然被我新的一篇觀(guān)察者模式給覆蓋了,數據取不回來(lái),只能匆匆完稿,大家見(jiàn)諒啊,有問(wèn)題我們一起來(lái)討論,畢竟我也是初學(xué)者。
【C#設計中單例模式實(shí)例講解】相關(guān)文章:
六級考試寫(xiě)作實(shí)例講解:話(huà)劇07-02
語(yǔ)文閱讀教學(xué)模式講解07-02
華為路由器配置實(shí)例詳細備注講解07-11
LOGO字體設計實(shí)例07-14
從零開(kāi)始學(xué)攝影,實(shí)例講解巧用延時(shí)自拍07-09
飛機方案設計實(shí)例07-03
抽樣方案設計實(shí)例07-03
觀(guān)察中的發(fā)現教材講解07-02
古詩(shī)講解教學(xué)設計07-03