单例模式与静态类的区别及优势2013-12-10有时候感觉单例模式与静态类的区别并不是那么明显,都是与数据无关的操作类,即整个过程不能太多的 数据依赖--更准确的说是对象依赖,最好是其只负责处理某一类型(传入的可以是接口)的对象,看看下面这 段代码:
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处理,降低模块间的耦合关系。那么静态 类与单例模式的具体区别在哪儿呐?

再说一下单例模式的优点:例如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可 能就发生变化了,因为要再次从数据库了更新数据,把新数据放入缓存里面。