單例模式:個人理解,保證只創建一個實例的設計模式。 用於資源單一,例如訪問資料庫等。 1.完整的單例模式 創建控制台命令,SingletonDemo 創建一個SingletonFirst類 class SingletonFirst { private SingletonFirst() //使用pri ...
單例模式:個人理解,保證只創建一個實例的設計模式。
用於資源單一,例如訪問資料庫等。
1.完整的單例模式
創建控制台命令,SingletonDemo
創建一個SingletonFirst類
class SingletonFirst
{
private SingletonFirst() //使用private的目的是,防止外部可以new 出
{
Thread.Sleep(1000);
Console.WriteLine("創建SingletonFirstDemo");
}
public static object obj = new object();//為了lock創建一個對象
public static SingletonFirst sf = null;//static 使用因為靜態函數調用必須為靜態變數
public static SingletonFirst CreateInstance()//用staic 是為了 類名.函數名可以直接調用
{
if (sf == null)
{
Console.WriteLine("進入臨界區");
lock (obj)//鎖定obj 知道被釋放 {開始 直到}結束釋放obj //加lock的目的為了使用於多線程使用一個資源
{
if (sf == null)
{
sf = new SingletonFirst();
}
}
}
return sf;
}
public void SingleShow()
{
Console.WriteLine("展示SingleShow()");
}
}
2.利用.Net frameWork CLR來創建單例模式
class SingletonSecond
{
private SingletonSecond()
{
Thread.Sleep(1000);
Console.WriteLine("創建SingletonFirstDemo");
}
static SingletonSecond() //靜態函數在編譯時就創建出對象,並且只有一個
{
sf = new SingletonSecond();
}
public static object obj = new object();
public static SingletonSecond sf = null;//static 使用因為靜態函數調用必須為靜態變數
public static SingletonSecond CreateInstance()//用staic 是為了 類名.函數名可以直接調用
{
return sf;
}
public void SingleShow()
{
Console.WriteLine("展示SingleShow()");
}
}
3.更簡便的方式
class SingletonThird
{
private SingletonThird()
{
Thread.Sleep(1000);
Console.WriteLine("創建SingletonFirstDemo");
}
public static SingletonThird sf = new SingletonThird();//static 使用因為靜態函數調用必須為靜態變數
public static SingletonThird CreateInstance()//用staic 是為了 類名.函數名可以直接調用 用CLR 保證
{
//不會被釋放的
return sf;
}
public void SingleShow()
{
Console.WriteLine("展示SingleShow()");
}