有时候感受单例模式与静态类的区别并非那么明显,都是与数据无关的操做类,即整个过程不能太多的数据依赖--更准确的说是对象依赖,最好是其只负责处理某一类型(传入的能够是接口)的对象,看看下面这段代码:数据库
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
可能就发生变化了,由于要再次从数据库了更新数据,把新数据放入缓存里面。
最后:欢迎各位大牛拍砖~~~