在軟體系統中,經常有一些類需要在整個系統中只能存在一個執行個體,才能保證系統邏輯的正確性及運行效率。如何能夠繞過構造器提供一種機制保證只建立一個執行個體?在這種需求的前提下,單件模式應運而生!
意圖:保證一個類只有一個執行個體,並提供一個合局訪問點訪問他們。
適用性:當類只能有一個執行個體而且客戶可以從一個眾所周知的訪問點訪問它時。當這個唯一執行個體應該是通過子類化可擴充的,並且客戶應該無需更改代碼就能使用一個擴充的執行個體時。
線程代碼實現:
class SingleThread_Singleton
{
private static SingleThread_Singelton instance = null;
private SingleThread_Singleton(){}
public static SinleThread_Singleton Instance
{
get
{
if(instance == null)
{
instance = new SingleThread_Singleton();
}
return instance;
}
}
}
上述代碼在單線程環境下執行是沒問題的,但如果在多線程時同時執行if(instance == null)時就會出現多個執行個體,如果想在多線程下保證單件模式,那麼需要修改代碼如下:
class MultiThread_Singleton
{
private static volatile MultiThread_Singelton instance = null;
private static object lookHelper = new object();
private MultiThread_Singleton(){}
public static MultiThread_Singleton Instance
{
get
{
if(instance == null)
{
lock(lookHelper)
{
instance = new MultiThread_Singleton();
}
}
return instance;
}
}
}
靜態Singleton的實現:
class Static_Singleton
{
public static readonly Static_Singleton instance = new Static_Singleton();
private Static_Singleton(){}
}
這樣就保證了instance的絕對的唯一執行個體;