C#設計形式之單例形式實例講授。本站提示廣大學習愛好者:(C#設計形式之單例形式實例講授)文章只能為提供參考,不一定能成為您想要的結果。以下是C#設計形式之單例形式實例講授正文
媒介
比來開端花點心思研討下設計形式,重要照樣讓本身寫的代碼可重用性高、包管代碼靠得住性。所謂設計形式,我找了下界說:是一套被重復應用、多半人知曉的、經由分類編目標、代碼設計經歷的總結。毫無疑問,設計形式於己於別人於體系都是多贏的;設計形式使代碼編制真正工程化;設計形式是軟件工程的基石頭緒,好像年夜廈的構造一樣。
為何要倡導“Design Pattern(設計形式)”?
基本緣由是為了代碼復用,增長可保護性。是以此次我們來進修下設計形式,最初會經由過程C#說話來完成這些設計形式作為例子,深入懂得個中的精華。
界說
單例形式是一種經常使用的軟件設計形式。在它的焦點構造中只包括一個被稱為單例類的特別類。經由過程單例形式可以包管體系中一個類只要一個實例並且該實例易於外界拜訪,從而便利對實例個數的掌握並勤儉體系資本。假如願望在體系中某個類的對象只能存在一個,單例形式是最好的處理計劃。
特色
1、 某個類只能有一個實例
2、它必需自行創立這個實例
3、它必需自行向全部體系供給這個實例。
優缺陷
長處:
1、實例掌握
單例形式會阻攔其他對象實例化其本身的單例對象的正本,從而確保一切對象都拜訪獨一實例。
2、靈巧性
由於類掌握了實例化進程,所以類可以靈巧更改實例化進程。
缺陷:
1、開支
固然數目很少,但假如每次對象要求援用時都要檢討能否存在類的實例,將依然須要一些開支。可以經由過程應用靜態初始化處理此成績。
2、能夠的開辟混雜
應用單例對象(特別在類庫中界說的對象)時,開辟人員必需記住本身不克不及應用new症結字實例化對象。由於能夠沒法拜訪庫源代碼,是以運用法式開辟人員能夠會心外發明本身沒法直接實例化此類。
3、對象生計期
不克不及處理刪除單個對象的成績。在供給內存治理的說話中(例如基於.NET Framework的說話),只要單例類可以或許招致實例被撤消分派,由於它包括對該實例的公有援用。在某些說話中(如 C++),其他類可以刪除對象實例,但如許會招致單例類中湧現懸浮援用。
/// <summary>
/// 單例形式
/// </summary>
public class Singleton
{
// 界說一個靜態變量來保留類的實例
private static Singleton mySingleton;
// 界說公有結構函數,使外界不克不及創立該類實例
private Singleton()
{
}
//界說私有辦法供給一個全局拜訪點。
public static Singleton GetInstance()
{
//這裡的lock其實應用的道理可以用一個詞語來歸納綜合“互斥”這個概念也是操作體系的精華
//其實就是當一個過程出去拜訪的時刻,其他過程便先掛起狀況
if (mySingleton == null)
{
mySingleton = new Singleton();
}
return mySingleton;
}
}
下面的單例形式的完成是有成績的,當多個用戶或許辦法同時拜訪的時刻,便會湧現多個用戶同時拿到了mySingleton==null的成果,這個顯著不是我們想要的,是以,我們應當經由過程一個鎖來互斥這個辦法,當許多線程同時拜訪的時刻,只許可一個線程進入到代碼中履行,而其他的便只能處於掛起的狀況。
/// <summary>
/// 單例形式
/// </summary>
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;
}
}
其其實一些項目中,單例形式早就有了表現。在開辟asp.net的項目中,就曾經用這類辦法來包裝http高低文來完成盤算機資本的節儉。
/// <summary>
/// 營業倉儲
/// </summary>
public IBLL.IBLLSession BLLSession;
//---------------------界說高低文屬性
#region 實例結構函數 初始化營業倉儲 + OperateContext()
public OperateContext()
{
BLLSession = DI.SpringHelper.GetObject<IBLL.IBLLSession>("BLLSession");
}
#endregion
#region Http高低文 和相干屬性
/// <summary>
/// Http高低文
/// </summary>
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 獲得以後操作高低文(存在線程中,進步效力) + OperateContext Current
// <summary>
/// 獲得以後操作高低文(存在線程中,進步效力)
/// </summary>
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
總結
到這裡,就和年夜家一路先懂得了單例形式究竟是個甚麼器械,其其實一些項目中,這類形式就曾經運用了,只是我們沒有去發明和總結,不外原來設計形式就是一套被重復應用、多半人知曉的、經由分類編目標、代碼設計經歷的總結。哎。。。。此次是第二次編纂了,原來這個單例形式曾經宣布了很多多少天,居然被我新的一篇不雅察者形式給籠罩了,數據取不回來,只能促脫稿,年夜家見諒啊,有成績我們一路來評論辯論,究竟我也是初學者。