剛剛看設計模式,還不知道這些設計模式有什么作用,但是先記錄下來,也許以后會用到!
單例模式:就是保證一個類只有一個實例的實現方法
如,有一個構造函數,使外界不能創建該類的實例
private 這個類的類名()
{
Console.Write("這是單例模式測試\n");
}
設置私有,保證它不能被外部實例化,
在當前類中建立一個靜態變量用來保存這個類的實例
private static 這個類的類名 example;
再定義一個標識,后面用來加鎖用到
private static readonly object locker = new object();
這些變量和標識都設置為私有,已保證不能被外部調用
之后就要建立一個公有的方法實例化這個類,外部通過調用這個公有的方法來得到這個類的實例
public static 這個類的類名 GetInstance()
1.判斷這個類是否實例化
if(example==null)
2.鎖住locker,是得locker被鎖期間不被執行里面的方法
lock (locker)
3.再次判斷類是否被實例化
if(example==null)
4.實例化這個類
example= new Singleton();
5.最后輸出這個類的實例
return example;
得到完整代碼
public class Singleton
{
//定義一個靜態變量來保存類的實例
private static Singleton example;
//定義一個標識確保線程同步
private static readonly object locker = new object();
//定義私有構造函數,使外界不能創建該類的實例
private Singleton()
{
Console.Write("這是單例模式測試\n");
}
/// <summary>
/// 定義公有方法提供一個全局訪問點,同時你也可以定義公有屬性來提供全局訪問點
/// </summary>
/// <returns></returns>
public static Singleton GetInstance()
{
//多線程同時運行到這里,會同時通過這個判斷條件執行條件內的代碼
if (example== null)//限制一
{
//多線程同時運行到這里后,只能有一個線程通過lock鎖,其他線程會被掛起
lock (locker)//限制二
{
// 再次判斷如果類的實例是否創建,如果不存在則實例化,反之就直接輸出類的實例
if (example== null)限制三
{
example= new Singleton();
}
}
}
return example;
}
}
如果有多個線程同時運行到限制一,會同時通過限制一,這樣的話就會就有多個線程同時運行到限制二,這些線程運行到限制二后,會進行一個小的“排序”,“排序”第一的線程通過限制二后,限制二就會自我封閉,直到“排序”第一的線程跑出限制二的范圍,限制二才會繼續允許其他“排序”的線程通過。這樣,到限制三的時候,就只有一個“排序”第一的線程了,排序第一的線程順利通過限制三,實例化類,跑出限制三,限制二。這里,剛才在等待的其他線程就會陸續通過限制二了,但是它們通過限制二也已經晚了,因為這個類已經被實例化過了,所以它們也就無法通限制三了,而直接輸出被“排序”第一的線程實例化后的類實例,