C#實現Singleton模式詳解
C#語言還是比較常見的東西,這里我們主要介紹C#實現Singleton模式,包括介紹C#不支持全局變量,但還是有可能在某個方法的一開始就在堆上創建了一個對象并直到很久以后才使用它。等方面。
C#實現Singleton模式
任何編寫過MFC應用的開發人員(不管編寫的應用是如何的小)都知道什么是Singleton。Singleton是類的***實例。使用MFC時,從CWinApp派生的應用類的全局實例就是Singleton。當然,在MFC應用中,盡管規定不允許創建應用類的第二個實例,但是并沒有什么可以阻止你那么做。在這種情況下,當你需要某個特定的類表現出Singleton行為時,一個更好的替代方案是讓這個類自己負責確保只會被創建一個并且只有一個實例。再回到MFC,我們知道保證應用類實例的***性的責任被留給了開發應用的程序員,他(她)們必須小心不要創建應用類的第二個實例。
現在來看看下面所示的類。Singleton的訪問被局限于必須通過靜態方法Instance。多數情況下,Singleton應該具有全局可見性,這可通過將其創建方法public來實現。和用全局變量模擬Singleton不同,這種模式可以防止創建出多余的實例,同時兼具全局可見性。注意,該類的構造器被置為private,這就意味著沒有任何辦法可以繞過靜態方法Instance來直接創建類的實例。
- class Singleton
- {
- private static Singleton singleton = null;
- public static Singleton Instance()
- {
- if (null == singleton)
- singleton = new Singleton();
- return singleton;
- }
- private Singleton()
- {
- }
- }
C#實現Singleton模式的作用還不止于此,尤其是可以將其擴展,以創建類的可變數量的實例。假定有一個應用,當需要執行特定任務時就需要調度一個工作者線程。考慮到節約系統資源,我們使用Singleton來實現這個線程類。不久,需要Singleton線程處理的任務變得密集起來,如果我們決定擴展這個應用,我們可以很方便地增加工作者線程的數量,因為線程的創建和對它們的訪問授權的所有邏輯都被定義在一個類中。
C#實現Singleton模式的另外一個優點是Singleton的創建可以被延遲到真正需要的時候。不管是否需要,全局變量一開始就被創建,但這個全局對象并不一定是一直都需要的。C#不支持全局變量,但還是有可能在某個方法的一開始就在堆上創建了一個對象并直到很久以后才使用它。果真如此的話,Singleton模式為這種案例提供了一個優雅的解決方案。
另外,作為一個工具,在Singleton模式的實現上,C#優于C++,盡管這個優點很微妙,但絕對重要。基于C++的實現需考慮Singleton帶來的一些和生命期管理有關的棘手問題,而在C#中則由運行時自動處理。這個優點是有意義的,在Singleton模式的C#實現版本中,你只需保證在需要Singleton的時候,你擁有一個活的引用即可。
C#示例:
- using System;
- class Singleton
- {
- private static Singleton singleton = null;
- public static Singleton Instance()
- {
- if (null == singleton)
- singleton = new Singleton();
- return singleton;
- }
- private Singleton()
- {
- }
- }
- class Application
- {
- public static void Main()
- {
- Singleton s1 = Singleton.Instance();
- //Singleton s2 = new Singleton(); //錯誤:構造器不可訪問
- Singleton s2 = Singleton.Instance();
- if (s1.Equals(s2)) // 引用相等
- Console.WriteLine("Instances are identical");
- }
- }
【編輯推薦】