大话设计之原型模式
? 原型模式:
? 用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
? 原型模式其實就是從一個對象再創建另外一個可定制的對象,而且不需知道任何創建的細節。
? 下面來看看關于原型模式的一段代碼:
class Program{static void Main(string[] args){Resume a = new Resume("徐志鵬");a.SetPersonalInfo("男", "22");a.SetWorkExperience("1998-2000", "XX公司");Resume b = (Resume)a.Clone();b.SetWorkExperience("1998-2006", "YY公司");Resume c = (Resume )a.Clone();c.SetPersonalInfo("男", "24");a.Display();b.Display();c.Display();Console.Read();}}class Resume : ICloneable{private string name;private string sex;private string age;private string timeArea;private string company;public Resume(string name){this.name = name;}//設置個人信息public void SetPersonalInfo(string sex, string age){this.sex = sex;this.age = age;}//設置工作經歷public void SetWorkExperience(string timeArea, string company){this.timeArea = timeArea;this.company = company;}//顯示public void Display(){Console.WriteLine("{0}{1}{2}", name, sex, age);Console.WriteLine("工作經歷:{0}{1}", timeArea, company);}public Object Clone(){return (object)this.MemberwiseClone();}}?
一般在初始化的信息不發生變化的情況下,克隆是最好的辦法。既隱藏了對象創建的細節,又對性能是大大的提高。動態地獲得對象運行時的狀態。
接下來關于淺復制和深復制
? 如果改需求呢,因為對象的數據都是string型的,而string是一種擁有值類型特點的特殊引用類型,MemberwiseClone()方法是這樣,如果字段是值類型的,則對該字段執行逐位復制,如果字段是引用類型,則復制引用但不復制引用的對象;因此,原始對象及其復本引用同一對象。也就是如果簡歷類中有對象引用那么引用對象數據是不會被克隆過來的。比如下面代碼:
class Program{static void Main(string[] args){Resume a = new Resume("徐志鵬");a.SetPersonalInfo("男", "29");a.SetWorkExperience("1998-2000", "XX公司");Resume b = (Resume)a.Clone();b.SetWorkExperience("1998-2006", "YY企業");Resume c = (Resume)a.Clone();c.SetPersonalInfo("男", "24");c.SetWorkExperience("1998-2003", "ZZ企業");a.Display();b.Display();c.Display();Console.Read();}}//簡歷class Resume : ICloneable{private string name;private string sex;private string age;private WorkExperience work;public Resume(string name){this.name = name;work = new WorkExperience();}//設置個人信息public void SetPersonalInfo(string sex, string age){this.sex = sex;this.age = age;}//設置工作經歷public void SetWorkExperience(string workDate, string company){work.WorkDate = workDate;work.Company = company;}//顯示public void Display(){Console.WriteLine("{0} {1} {2}", name, sex, age);Console.WriteLine("工作經歷:{0} {1}", work.WorkDate, work.Company);}public Object Clone(){return (Object)this.MemberwiseClone();}}//工作經歷class WorkExperience{private string workDate;public string WorkDate{get { return workDate; }set { workDate = value; }}private string company;public string Company{get { return company; }set { company = value; }}}結果顯示
徐志鵬 男 29
工作經歷 1998-2003 ZZ企業
徐志鵬 男 29
工作經歷 1998-2003 ZZ企業
徐志鵬 男 24
工作經歷 1998-2003 ZZ企業
這樣看出當對引用類型進行復制時,就僅僅復制了引用,感覺有點繞嘴。
淺復制:被復制對象所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用都仍然指向原來的對象。
深復制:深復制把引用對象的變量指向復制過的新對象,而不是原有的被引用的對象。
我們來看看深復制的代碼:
class Program{static void Main(string[] args){Resume a = new Resume("徐志鵬");a.SetPersonalInfo("男", "29");a.SetWorkExperience("1998-2000", "XX公司");Resume b = (Resume)a.Clone();b.SetWorkExperience("1998-2006", "YY企業");Resume c = (Resume)a.Clone();c.SetWorkExperience("1998-2003", "ZZ企業");a.Display();b.Display();c.Display();Console.Read();}}//簡歷class Resume : ICloneable{private string name;private string sex;private string age;private WorkExperience work;public Resume(string name){this.name = name;work = new WorkExperience();}private Resume(WorkExperience work){this.work = (WorkExperience)work.Clone();}//設置個人信息public void SetPersonalInfo(string sex, string age){this.sex = sex;this.age = age;}//設置工作經歷public void SetWorkExperience(string workDate, string company){work.WorkDate = workDate;work.Company = company;}//顯示public void Display(){Console.WriteLine("{0} {1} {2}", name, sex, age);Console.WriteLine("工作經歷:{0} {1}", work.WorkDate, work.Company);}public Object Clone(){Resume obj = new Resume(this.work);obj.name = this.name;obj.sex = this.sex;obj.age = this.age;return obj;}}//工作經歷class WorkExperience : ICloneable{private string workDate;public string WorkDate{get { return workDate; }set { workDate = value; }}private string company;public string Company{get { return company; }set { company = value; }}public Object Clone(){return (Object)this.MemberwiseClone();}}
在一些特定場合會經常設計到深復制和淺復制,比如說,數據集對象DataSet,它就有Clone()方法和Copy()方法,Clone()方法用來復制DataSet的結構,但是不復制DataSet的數據,實現了原型模式的淺復制。Copy()方法不但復制結構,也復制數據。實現了原型模式的深復制。
轉載于:https://www.cnblogs.com/xzpblog/p/5117994.html
總結
- 上一篇: DB2常用函数:字符串函数
- 下一篇: 从一个hibernate配置文件中了解到