有時候感受單例模式與靜態類的區別並非那麼明顯,都是與數據無關的操做類,即整個過程不能太多的數據依賴--更準確的說是對象依賴,最好是其只負責處理某一類型(傳入的能夠是接口)的對象,看看下面這段代碼:數據庫
interface IPeople { string Name { set;} int Age { set; } string ToStringPeople(); } class PeopleServer { public PeopleServer() { } public void ToStringPeople(IPeople p) { Console.WriteLine(p.ToStringPeople()); } }
這樣全部實現IPeople接口的對象均可以被PeopleServer處理,下降模塊間的耦合關係。那麼靜態類與單例模式的具體區別在哪兒吶?c#
區別
|
單例模式
|
靜態類
|
繼承
|
能夠繼承、實現接口
|
能夠集成類,但不能實例成員
|
加載
|
單例模式比較靈活,可在須要的時候進行初始化
|
其在編譯時就已經初始化了,成本相對昂貴,即便不使用。
|
資源釋放
|
靜態對象不會被GC清除,除非整個CLR/JVM退出。
|
在靜態類中靜態方法產生的對象,當起執行結束後會被GC清除
|
多態
|
能夠有多態
|
不支持多態
|
對象擴展
|
由於單例模式是隻有惟一的一個實例,它能夠跟隨系統進行動態的改變,有利於後期的增長和維護,而且具備狀態性這一特徵
|
不支持擴展
|
再說一下單例模式的優勢:例如DAO初始化會比較佔用系統資源,若是經靜態方法,會不斷初始化和釋放資源,這個時候若是不涉及複雜的事務管理,則使用單例模式會比較好。並且其使用方便,初始化靈活,我的感受其優於靜態類。
在舉個代碼的例子:
/// <summary> /// 站點僞Url信息類 /// </summary> public class SiteUrls { #region 內部屬性和方法 private static object lockHelper = new object(); private static volatile SiteUrls instance = null; string SiteUrlsFile = Utils.GetXmlMapPath(DTKeys.FILE_SITE_XML_CONFING); private ArrayList _Urls; public ArrayList Urls { get { return _Urls; } set { _Urls = value; } } private NameValueCollection _Paths; public NameValueCollection Paths { get { return _Paths; } set { _Paths = value; } } private SiteUrls() { Urls = new ArrayList(); Paths = new NameValueCollection(); BLL.url_rewrite bll = new BLL.url_rewrite(); List<Model.url_rewrite> ls = bll.GetList(""); foreach (Model.url_rewrite model in ls) { Paths.Add(model.name, model.path); model.page = model.page.Replace("^", "&"); model.querystring = model.querystring.Replace("^", "&"); Urls.Add(model); } } #endregion public static SiteUrls GetSiteUrls() { SiteUrls _cache = CacheHelper.Get<SiteUrls>(DTKeys.CACHE_SITE_HTTP_MODULE); lock (lockHelper) { if (_cache == null) { CacheHelper.Insert(DTKeys.CACHE_SITE_HTTP_MODULE, new SiteUrls(), Utils.GetXmlMapPath(DTKeys.FILE_URL_XML_CONFING)); instance = CacheHelper.Get<SiteUrls>(DTKeys.CACHE_SITE_HTTP_MODULE); } } return instance; } }
注意這個時候的private
ArrayList _Urls;
就能夠在系統運行時動態增長是可變的,當咱們更新SiteUrls的值的時候那麼Cache對象對象已經被Remove掉了,當咱們再次調用它的時候那麼return
instance
可能就發生變化了,由於要再次從數據庫了更新數據,把新數據放入緩存裏面。
最後:歡迎各位大牛拍磚~~~