單體模式(Singleton)是經常為了保證應用程式操作某一全域對象,讓其保持一致而產生的對象,例如對檔案的讀寫操作的鎖定,資料庫操作的時候的交易回復,還有工作管理員操作,都是一單體模式讀取的。 建立一個單體模式類,必須符合三個條件: 1:私人建構函式(防止其他對象建立執行個體); 2:一個單體類型的私人變數; 3:靜態全域擷取介面 下面我寫一個類,為了看是不是單體,就加了一個計數器,如果是同一個類,那麼這個類的計數每次調用以後就應該自動加一,而不是重建立對象歸零: .NET c# 單體模式
using System; using System.Threading;
public class Singleton
{
private int ObjCount=0;
private Singleton()
{ Console.WriteLine("建立對象"); }
private static Singleton objInstance = null;
public static Singleton getInstance()
{
if (objInstance==null) objInstance=new Singleton();
return objInstance;
}
public void ShowCount()
{ O
bjCount++;
Console.WriteLine("單個對象被調用了{0}次",ObjCount);
}
}; 然後我們來測試一下: public class ConsoleTest{ public static void Main(string[] args){ Console.WriteLine("開始執行單體模式"); for(int i=0;i<5;i++){ Singleton.getInstance().ShowCount(); } Console.ReadLine(); } };
我在這個Main裡面執行了5次,看看輸出的結果: 開始執行單體模式 建立對象 單個對象被調用了1次 單個對象被調用了2次 單個對象被調用了3次 單個對象被調用了4次 單個對象被調用了5次 在這裡可以看出,每次都是使用的同一個對象,實現了單體。 為了測試在多線程下面是否是單體,下面我寫了一個多線程測試的: class ApartmentTest { public static void RunMoreThread() { Thread newThread = new Thread(new ThreadStart(ThreadSingleMethod)); newThread.SetApartmentState(ApartmentState.MTA); Console.WriteLine("ThreadState: {0}, ApartmentState: {1},ManagedThreadId:{2}", newThread.ThreadState, newThread.GetApartmentState(),newThread.ManagedThreadId ); newThread.Start(); } public static void ThreadSingleMethod() { Singleton.getInstance().ShowCount(); } };
然後每次for迴圈執行ApartmentTest.RunMoreThread(); 再看看輸出的結果:開始執行單體模式 ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:3 建立對象 單個對象被調用了1次 ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:4 單個對象被調用了2次 ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:5 單個對象被調用了3次 ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:6 單個對象被調用了4次 ThreadState: Unstarted, ApartmentState: MTA,ManagedThreadId:7 單個對象被調用了5次 根據ManagedThreadId,可以看出不同的線路訪問達到了單體,OK!