小记:再谈单例模式静态类区别优势
? ?有時候感覺單例模式與靜態類的區別并不是那么明顯,都是與數據無關的操作類,即整個過程不能太多的數據依賴--更準確的說是對象依賴,最好是其只負責處理某一類型(傳入的可以是接口)的對象,看看下面這段代碼:
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處理,降低模塊間的耦合關系。那么靜態類與單例模式的具體區別在哪兒吶?
區別 | 單例模式 | 靜態類 |
繼承 | 可以繼承、實現接口 | 可以集成類,但不能實例成員 |
加載 | 單例模式比較靈活,可在需要的時候進行初始化 | 其在編譯時就已經初始化了,成本相對昂貴,即使不使用。 |
資源釋放 | 靜態對象不會被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);}}#endregionpublic 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可能就發生變化了,因為要再次從數據庫了更新數據,把新數據放入緩存里面。
最后:歡迎各位大牛拍磚~~~
轉載于:https://blog.51cto.com/tongling/1247930
總結
以上是生活随笔為你收集整理的小记:再谈单例模式静态类区别优势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言位操作--不用中间变量交换两数值
- 下一篇: hadoop--历史服务器配置