小记:再谈单例模式&静态类区别优点

   有时候感受单例模式与静态类的区别并非那么明显,都是与数据无关的操做类,即整个过程不能太多的数据依赖--更准确的说是对象依赖,最好是其只负责处理某一类型(传入的能够是接口)的对象,看看下面这段代码:数据库

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#

区别 缓存

单例模式 ide

静态类 url

继承 spa

能够继承、实现接口 code

能够集成类,但不能实例成员 对象

加载 继承

单例模式比较灵活,可在须要的时候进行初始化 接口

其在编译时就已经初始化了,成本相对昂贵,即便不使用。

资源释放

静态对象不会被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可能就发生变化了,由于要再次从数据库了更新数据,把新数据放入缓存里面。


最后:欢迎各位大牛拍砖~~~

相关文章
相关标签/搜索