C#設計中單例模式實例講解
- 設計
- 關注:1.86W次
前言
最近開始花點心思研究下設計模式,主要還是讓自己寫的代碼可重用性高、保證代碼可靠性。所謂設計模式,我找了下定義:是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使代碼編制真正工程化;設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。
為什麼要提倡“Design Pattern(設計模式)”?
根本原因是為了代碼複用,增加可維護性。因此這次我們來學習下設計模式,最後會通過C#語言來實現這些設計模式作為例子,深刻理解其中的精髓。
定義
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
特點
1、 某個類只能有一個實例
2、它必須自行創建這個實例
3、它必須自行向整個系統提供這個實例。
優缺點
優點:
一、實例控制
單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。
二、靈活性
因為類控制了實例化過程,所以類可以靈活更改實例化過程。
缺點:
一、開銷
雖然數量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。
二、可能的開發混淆
使用單例對象(尤其在類庫中定義的對象)時,開發人員必須記住自己不能使用new關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發人員可能會意外發現自己無法直接實例化此類。
三、對象生存期
不能解決刪除單個對象的問題。在提供內存管理的`語言中(例如基於 Framework的語言),只有單例類能夠導致實例被取消分配,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實例,但這樣會導致單例類中出現懸浮引用。
複製代碼 代碼如下:
///
/// 單例模式
///
public class Singleton
{
// 定義一個靜態變量來保存類的實例
private static Singleton mySingleton;
// 定義私有構造函數,使外界不能創建該類實例
private Singleton()
{
}
//定義公有方法提供一個全局訪問點。
public static Singleton GetInstance()
{
//這裏的lock其實使用的原理可以用一個詞語來概括“互斥”這個概念也是操作系統的精髓
//其實就是當一個進程進來訪問的時候,其他進程便先掛起狀態
if (mySingleton == null)
{
mySingleton = new Singleton();
}
return mySingleton;
}
}
上面的單例模式的實現是有問題的,當多個用户或者方法同時訪問的時候,便會出現多個用户同時拿到了mySingleton==null的結果,這個明顯不是我們想要的,因此,我們應該通過一個鎖來互斥這個方法,當很多線程同時訪問的時候,只允許一個線程進入到代碼中執行,而其他的便只能處於掛起的狀態。
複製代碼 代碼如下:
///
/// 單例模式
///
public class Singleton
{
// 定義一個靜態變量來保存類的實例
private static Singleton mySingleton;
// 定義一個標識確保線程同步
private static readonly object locker = new object();
// 定義私有構造函數,使外界不能創建該類實例
private Singleton()
{
}
//定義公有方法提供一個全局訪問點。
public static Singleton GetInstance()
{
//這裏的lock其實使用的原理可以用一個詞語來概括“互斥”這個概念也是操作系統的精髓
//其實就是當一個進程進來訪問的時候,其他進程便先掛起狀態
if (mySingleton == null)//區別就在這裏
{
lock (locker)
{
// 如果類的實例不存在則創建,否則直接返回
if (mySingleton == null)
{
mySingleton = new Singleton();
}
}
}
return mySingleton;
}
}
其實在一些項目中,單例模式早就有了體現。在開發的項目中,就已經用這種方法來包裝http上下文來實現計算機資源的節省。
複製代碼 代碼如下:
///
/// 業務倉儲
///
public Session BLLSession;
//---------------------定義上下文屬性
#region 實例構造函數 初始化業務倉儲 + OperateContext()
public OperateContext()
{
BLLSession = bject
}
#endregion
#region Http上下文 以及相關屬性
///
/// Http上下文
///
HttpContext ContextHttp
{
get
{
return ent;
}
}
HttpResponse Response
{
get
{
return onse;
}
}
HttpRequest Request
{
get
{
return est;
}
}
HttpSessionState Session
{
get
{
return ion;
}
}
#endregion
#region 獲取當前操作上下文(存在線程中,提高效率) + OperateContext Current
//
/// 獲取當前操作上下文(存在線程中,提高效率)
///
public static OperateContext Current
{
get
{
OperateContext o = ata(typeof(OperateContext)) as OperateContext;
if (o == null)
{
o = new OperateContext();
ata(typeof(OperateContext), o);
}
return o;
}
}
#endregion
總結
到這裏,就和大家一起先了解了單例模式到底是個什麼東西,其實在一些項目中,這種模式就已經應用了,只是我們沒有去發現和總結,不過本來設計模式就是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。哎。。。。這次是第二次編輯了,本來這個單例模式已經發布了好多天,竟然被我新的一篇觀察者模式給覆蓋了,數據取不回來,只能匆匆完稿,大家見諒啊,有問題我們一起來討論,畢竟我也是初學者。
- 文章版權屬於文章作者所有,轉載請註明 https://xuewengu.com/flhy/sheji/2v9093.html