1. 程式人生 > >設計模式-原型模式、單例模式

設計模式-原型模式、單例模式

原型模式:

該模式用於克隆物件,有2種方式

  1. 淺克隆(不復制引用型別)
  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();
        }   
    }