c#設計模式-單例模式

一.原因

面試的過程中被問到設計模式的問題,所以我就先從簡單的設計模式開始談談。

 

二.介紹

從“單例”字面意思上理解爲——一個類只有一個實例,所以單例模式也就是保證一個類只有一個實例的一種實現方法罷了(設計模式其實就是幫助我們解決實際開發過程中的方法, 該方法是爲了降低對象之間的耦合度,然而解決方法有很多種,所以前人就總結了一些常用的解決方法爲書籍,從而把這本書就稱爲設計模式),下面給出單例模式的一個百度百科的定義:單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。

 

三.單例模式的應用

在我們日常使用的在Windows中也有不少單例模式設計的組件,象常用的文件管理器。由於Windows操作系統是一個典型的多進程多線程系統,那麼在創建或者刪除某個文件的時候,就不可避免地出現多個進程或線程同時操作一個文件的現象。採用單例模式設計的文件管理器就可以完美的解決這個問題,所有的文件操作都必須通過唯一的實例進行,這樣就不會產生混亂的現象。

再比如,每臺計算機可以有若干個打印機,如果每一個進程或者線程都獨立地使用打印機資源的話,那麼我們打印出來的結果就有可能既包含這個打印任務的一部分,又包含另外一個打印任務的一部分。所以,大多數的操作系統最終爲打印任務設計了一個單例模式的假脫機服務Printer Spooler,所有的打印任務都需要通過假脫機服務進行。

實際上,配置信息類、管理類、控制類、門面類、代理類通常被設計爲單例類。像Java的Struts、spring框架,.Net的Spring.NET框架,以及PHP的Zend框架都大量使用了單例模式。

四.實例

第一種最簡單,但沒有考慮線程安全,在多線程時可能會出問題,

public class Singleton
{
    private static Singleton _instance = null;
    private Singleton(){}
    public static Singleton CreateInstance()
    {
        if(_instance == null)
        {
            _instance = new Singleton();
        }
        return _instance;
    }
}

 


 

第二種考慮了線程安全,不過有點煩,但絕對是正規寫法,經典的一叉 

public class Singleton
{
    private volatile static Singleton _instance = null;
    private static readonly object lockHelper = new object();
    private Singleton(){}
    public static Singleton CreateInstance()
    {
        if(_instance == null)
        {
            lock(lockHelper)
            {
                if(_instance == null)
                     _instance = new Singleton();
            }

        }

        return _instance;
    }

}



第三種可能是C#這樣的高級語言特有的,實在懶得出奇

 public class Singleton
{
    private Singleton(){}
    public static readonly Singleton instance = new Singleton();
}

使用Singleton模式有一個必要條件:在一個系統要求一個類只有一個實例時才應當使用單例模式。反過來,如果一個類可以有幾個實例共存,就不要使用單例模式。

注意:

不要使用單例模式存取全局變量。這違背了單例模式的用意,最好放到對應類的靜態成員中。

不要將數據庫連接做成單例,因爲一個系統可能會與數據庫有多個連接,並且在有連接池的情況下,應當儘可能及時釋放連接。Singleton模式由於使用靜態成員存儲類實例,所以可能會造成資源無法及時釋放,帶來問題。

 

 

 

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