設計模式-原型模式、單例模式
阿新 • • 發佈:2018-12-26
原型模式:
該模式用於克隆物件,有2種方式
- 淺克隆(不復制引用型別)
- 深克隆(將值型別、引用型別均複製)
C#中提供了MemberwiseClone()方法用於淺克隆和ICloneable介面用於實現深克隆
單例模式 :
餓漢式單例模式
public class TaskManager { //靜態成員 private static TaskManager instance=new TaskManager(); //私有建構函式,用於防止外部建立物件 private TaskManager() { tid = "1001"; Console.WriteLine("tid:" + tid + "正在建立程序..."); } //獲取單例例項的 靜態方法 public static TaskManager GetInstance() { Console.WriteLine("已存在程序tid:" + instance.tid + ",不再建立新程序"); return instance; } //其他成員和方法 private string tid; public void Open() { Console.WriteLine("tid:" + tid+" 正在開啟工作管理員..." ); } public void Close() { Console.WriteLine("tid:" + tid + " 正在關閉工作管理員..."); } }
懶漢式單例模式
//懶漢式單例模式 public class TaskManager { //靜態成員 private static TaskManager instance; //私有建構函式,用於防止外部建立物件 private TaskManager() { tid = "1001"; Console.WriteLine("tid:" + tid + "正在建立程序..."); } //獲取單例例項的 靜態方法 public static TaskManager GetInstance() { if (instance == null) { instance = new TaskManager(); } else { Console.WriteLine("已存在程序tid:" + instance.tid + ",不再建立新程序"); } return instance; } //其他成員和方法 private string tid; public void Open() { Console.WriteLine("tid:" + tid+" 正在開啟工作管理員..." ); } public void Close() { Console.WriteLine("tid:" + tid + " 正在關閉工作管理員..."); } }
執行緒安全的 懶漢單例模式
//執行緒安全的 懶漢單例模式 public class TaskManager { //靜態成員 private static TaskManager instance; //同步鎖 private static readonly object myLock = new object(); //私有建構函式,用於防止外部建立物件 private TaskManager() { tid = "1001"; Console.WriteLine("tid:" + tid + "正在建立程序..."); } //獲取單例例項的 靜態方法 public static TaskManager GetInstance() { if (instance == null) { //同步程式碼塊 lock(myLock) { //再次判斷 if (instance == null) instance = new TaskManager(); } } else { Console.WriteLine("已存在程序tid:" + instance.tid + ",不再建立新程序"); } return instance; } //其他成員和方法 private string tid; public void Open() { Console.WriteLine("tid:" + tid+" 正在開啟工作管理員..." ); } public void Close() { Console.WriteLine("tid:" + tid + " 正在關閉工作管理員..."); } }
客戶端程式碼
class Program
{
static void Main(string[] args)
{
//模擬 使用者開啟了2次工作管理員
TaskManager taskManager1 = TaskManager.GetInstance();
TaskManager taskManager2 = TaskManager.GetInstance();
taskManager1.Open();
taskManager2.Close();
}
}