小記:再談單例模式&靜態類區別優勢

   有時候感覺單例模式與靜態類的區別並不是那麼明顯,都是與數據無關的操作類,即整個過程不能太多的數據依賴--更準確的說是對象依賴,最好是其只負責處理某一類型(傳入的可以是接口)的對象,看看下面這段代碼:

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);
        }
    }
    #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可能就發生變化了,因爲要再次從數據庫了更新數據,把新數據放入緩存裏面。


最後:歡迎各位大牛拍磚~~~






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章