小记:再谈单例模式静态类区别优势
? ?有時(shí)候感覺單例模式與靜態(tài)類的區(qū)別并不是那么明顯,都是與數(shù)據(jù)無關(guān)的操作類,即整個(gè)過程不能太多的數(shù)據(jù)依賴--更準(zhǔn)確的說是對(duì)象依賴,最好是其只負(fù)責(zé)處理某一類型(傳入的可以是接口)的對(duì)象,看看下面這段代碼:
interface IPeople {string Name { set;}int Age { set; }string ToStringPeople(); } class PeopleServer {public PeopleServer() { }public void ToStringPeople(IPeople p){Console.WriteLine(p.ToStringPeople());} }這樣所有實(shí)現(xiàn)IPeople接口的對(duì)象都可以被PeopleServer處理,降低模塊間的耦合關(guān)系。那么靜態(tài)類與單例模式的具體區(qū)別在哪兒吶?
區(qū)別 | 單例模式 | 靜態(tài)類 |
繼承 | 可以繼承、實(shí)現(xiàn)接口 | 可以集成類,但不能實(shí)例成員 |
加載 | 單例模式比較靈活,可在需要的時(shí)候進(jìn)行初始化 | 其在編譯時(shí)就已經(jīng)初始化了,成本相對(duì)昂貴,即使不使用。 |
資源釋放 | 靜態(tài)對(duì)象不會(huì)被GC清除,除非整個(gè)CLR/JVM退出。 | 在靜態(tài)類中靜態(tài)方法產(chǎn)生的對(duì)象,當(dāng)起執(zhí)行結(jié)束后會(huì)被GC清除 |
多態(tài) | 可以有多態(tài) | 不支持多態(tài) |
對(duì)象擴(kuò)展 | 因?yàn)閱卫J绞侵挥形ㄒ坏囊粋€(gè)實(shí)例,它可以跟隨系統(tǒng)進(jìn)行動(dòng)態(tài)的改變,有利于后期的增加和維護(hù),并且具有狀態(tài)性這一特征 | 不支持?jǐn)U展 |
再說一下單例模式的優(yōu)點(diǎn):例如DAO初始化會(huì)比較占用系統(tǒng)資源,如果經(jīng)靜態(tài)方法,會(huì)不斷初始化和釋放資源,這個(gè)時(shí)候如果不涉及復(fù)雜的事務(wù)管理,則使用單例模式會(huì)比較好。而且其使用方便,初始化靈活,個(gè)人感覺其優(yōu)于靜態(tài)類。
在舉個(gè)代碼的例子:
/// <summary> /// 站點(diǎn)偽Url信息類 /// </summary> public class SiteUrls {#region 內(nèi)部屬性和方法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;} }注意這個(gè)時(shí)候的private ArrayList _Urls;就可以在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)增加是可變的,當(dāng)我們更新SiteUrls的值的時(shí)候那么Cache對(duì)象對(duì)象已經(jīng)被Remove掉了,當(dāng)我們?cè)俅握{(diào)用它的時(shí)候那么return instance可能就發(fā)生變化了,因?yàn)橐俅螐臄?shù)據(jù)庫了更新數(shù)據(jù),把新數(shù)據(jù)放入緩存里面。
最后:歡迎各位大牛拍磚~~~
轉(zhuǎn)載于:https://blog.51cto.com/tongling/1247930
總結(jié)
以上是生活随笔為你收集整理的小记:再谈单例模式静态类区别优势的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言位操作--不用中间变量交换两数值
- 下一篇: hadoop--历史服务器配置