1.什么是單例模式?
單例模式就是保證行程中某一個類只有一個實體,
2.為什么要有單列模式?
1)構造物件需要耗時好資源
2)一個物件可能會在多個地方存在
3)想避免物件重復構造
3.怎么保證只有一個實體?
1)私有化建構式,避免別人去實體化物件
2)在類里面提供一個公開的靜態方法,在靜態方法里面實體化物件
3)初始化一個公開的靜態欄位用于回傳實體化的物件,保證全域只有一個物件
4.應對一些特殊情況:比如資料庫連接池,全域唯一號碼生成器
5.單例的兩種模式
1)經典模式:就是我們經常說的雙IF+鎖(Lock)
1 public class Singleton 2 { 3 private static Singleton _singleton = null; 4 private static object _isLock = new object(); 5 6 public static Singleton CreateIntance() 7 { 8 //物件_singleton已經被初始化了就不要進入鎖等待了 9 if (_singleton == null) 10 { 11 //加鎖,保證任意時刻只有一個執行緒進入lock范圍 12 lock (_isLock) 13 { 14 Thread.Sleep(3000); 15 Console.WriteLine("等待鎖2s之后在繼續..."); 16 //物件是否已經創建 17 if (_singleton == null) 18 { 19 _singleton = new Singleton(); 20 } 21 } 22 } 23 return _singleton; 24 }
25 }
2)饑餓模式
1 public class Hungry 2 { 3 private static Hungry _singleton = null; 4 private static Hungry _singleton1 = new Hungry(); 5 /// <summary> 6 /// 靜態建構式:由CLR保證,程式第一次使用這個型別前被呼叫一次,并且只呼叫一次 7 /// 檢測,初始化, 8 /// 寫日志功能的檔案夾檢測 9 /// XML組態檔 10 /// </summary> 11 static Hungry() 12 { 13 _singleton = new Hungry(); 14 Console.WriteLine($"Hungry 被啟用..."); 15 } 16 17 /// <summary> 18 /// 惡漢模式,只要使用這個類就會被呼叫 19 /// </summary> 20 /// <returns></returns> 21 public static Hungry CreateIntance() 22 { 23 return _singleton; 24 } 25 26 /// <summary> 27 /// 靜態欄位在第一次使用這個類之前,由CLR保證初始化并且只初始化一次(比建構式還早) 28 /// 惡漢模式,只要使用這個類就會被呼叫 29 /// </summary> 30 /// <returns></returns> 31 public static Hungry CreateIntance1() 32 { 33 return _singleton1; 34 } 35 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/3103.html
標籤:設計模式
下一篇:裝飾器模式
