日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

大话设计之原型模式

發(fā)布時(shí)間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大话设计之原型模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? 原型模式:

? 用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi),并且通過(guò)拷貝這些原型創(chuàng)建新的對(duì)象。

? 原型模式其實(shí)就是從一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,而且不需知道任何創(chuàng)建的細(xì)節(jié)。

? 下面來(lái)看看關(guān)于原型模式的一段代碼:

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;}//設(shè)置個(gè)人信息public void SetPersonalInfo(string sex, string age){this.sex = sex;this.age = age;}//設(shè)置工作經(jīng)歷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("工作經(jīng)歷:{0}{1}", timeArea, company);}public Object Clone(){return (object)this.MemberwiseClone();}}
?

一般在初始化的信息不發(fā)生變化的情況下,克隆是最好的辦法。既隱藏了對(duì)象創(chuàng)建的細(xì)節(jié),又對(duì)性能是大大的提高。動(dòng)態(tài)地獲得對(duì)象運(yùn)行時(shí)的狀態(tài)。

接下來(lái)關(guān)于淺復(fù)制和深復(fù)制

? 如果改需求呢,因?yàn)閷?duì)象的數(shù)據(jù)都是string型的,而string是一種擁有值類(lèi)型特點(diǎn)的特殊引用類(lèi)型,MemberwiseClone()方法是這樣,如果字段是值類(lèi)型的,則對(duì)該字段執(zhí)行逐位復(fù)制,如果字段是引用類(lèi)型,則復(fù)制引用但不復(fù)制引用的對(duì)象;因此,原始對(duì)象及其復(fù)本引用同一對(duì)象。也就是如果簡(jiǎn)歷類(lèi)中有對(duì)象引用那么引用對(duì)象數(shù)據(jù)是不會(huì)被克隆過(guò)來(lái)的。比如下面代碼:

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企業(yè)");Resume c = (Resume)a.Clone();c.SetPersonalInfo("男", "24");c.SetWorkExperience("1998-2003", "ZZ企業(yè)");a.Display();b.Display();c.Display();Console.Read();}}//簡(jiǎn)歷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();}//設(shè)置個(gè)人信息public void SetPersonalInfo(string sex, string age){this.sex = sex;this.age = age;}//設(shè)置工作經(jīng)歷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("工作經(jīng)歷:{0} {1}", work.WorkDate, work.Company);}public Object Clone(){return (Object)this.MemberwiseClone();}}//工作經(jīng)歷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; }}}結(jié)果顯示

徐志鵬 男 29

工作經(jīng)歷 1998-2003 ZZ企業(yè)

徐志鵬 男 29

工作經(jīng)歷 1998-2003 ZZ企業(yè)

徐志鵬 男 24

工作經(jīng)歷 1998-2003 ZZ企業(yè)


這樣看出當(dāng)對(duì)引用類(lèi)型進(jìn)行復(fù)制時(shí),就僅僅復(fù)制了引用,感覺(jué)有點(diǎn)繞嘴。

淺復(fù)制:被復(fù)制對(duì)象所有變量都含有與原來(lái)的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用都仍然指向原來(lái)的對(duì)象。

深復(fù)制:深復(fù)制把引用對(duì)象的變量指向復(fù)制過(guò)的新對(duì)象,而不是原有的被引用的對(duì)象。

我們來(lái)看看深復(fù)制的代碼:

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企業(yè)");Resume c = (Resume)a.Clone();c.SetWorkExperience("1998-2003", "ZZ企業(yè)");a.Display();b.Display();c.Display();Console.Read();}}//簡(jiǎn)歷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();}//設(shè)置個(gè)人信息public void SetPersonalInfo(string sex, string age){this.sex = sex;this.age = age;}//設(shè)置工作經(jīng)歷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("工作經(jīng)歷:{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;}}//工作經(jīng)歷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();}}

在一些特定場(chǎng)合會(huì)經(jīng)常設(shè)計(jì)到深復(fù)制和淺復(fù)制,比如說(shuō),數(shù)據(jù)集對(duì)象DataSet,它就有Clone()方法和Copy()方法,Clone()方法用來(lái)復(fù)制DataSet的結(jié)構(gòu),但是不復(fù)制DataSet的數(shù)據(jù),實(shí)現(xiàn)了原型模式的淺復(fù)制。Copy()方法不但復(fù)制結(jié)構(gòu),也復(fù)制數(shù)據(jù)。實(shí)現(xiàn)了原型模式的深復(fù)制。

轉(zhuǎn)載于:https://www.cnblogs.com/xzpblog/p/5117994.html

總結(jié)

以上是生活随笔為你收集整理的大话设计之原型模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。