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

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

生活随笔

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

编程问答

浅谈原型模式

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

? ? ? 近期菜鳥(niǎo)D在看《大話設(shè)計(jì)模式》,看到原型模式,有一點(diǎn)自己的想法,所以就記下來(lái)。

? ? ? 老規(guī)矩,解釋定義:

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

? ? ? Prototype原型模式是一種創(chuàng)建型設(shè)計(jì)模式,Prototype模式允許一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,根本無(wú)需知道任何如何創(chuàng)建的細(xì)節(jié),工作原理是:通過(guò)將一個(gè)原型對(duì)象傳給那個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象,這個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象通過(guò)請(qǐng)求原型對(duì)象拷貝它們自己來(lái)實(shí)施創(chuàng)建。 ? ? ? ? ? ? ? ? ? ? ? ? ?——來(lái)自百度?

? ? ? 由于感覺(jué)光看書(shū)不動(dòng)手實(shí)踐一下有點(diǎn)不靠譜,就按著自己的理解寫(xiě)了段代碼,情景參照《大話設(shè)計(jì)模式》第9章,簡(jiǎn)歷的復(fù)制。

代碼如下:

//原型類實(shí)現(xiàn)接口ICloneable public class Prototype : ICloneable{public string ID { get; private set; }public string Exp { get; set; }private Company company = new Company();public Prototype(string id){ID = id;}public void SetExp(string exp){Exp = exp;}#region 引用類型的拷貝//SetCompany是淺拷貝public void SetCompany(string address){company.Address = address;}//SetCompany1是深拷貝public void SetCompany1(string address){Company c = (Company)company.Clone();c.Address = address;company = c;} #endregionpublic void Show(){Console.WriteLine("id:{0} exp:{1} company:{2}", ID, Exp, company.Address);}public object Clone(){return MemberwiseClone();}}//公司類,也可以拷貝 public class Company : ICloneable{private string address;public string Address{get { return address; }set { address = value; }}public object Clone(){return MemberwiseClone();}}//客戶端Prototype p1 = new Prototype("1");p1.SetExp("半年經(jīng)驗(yàn)");p1.SetCompany("世紀(jì)財(cái)富中心");//p1.Show();Prototype p2 = (Prototype)p1.Clone();p2.SetExp("1年經(jīng)驗(yàn)");p2.SetCompany("帝國(guó)大廈");//p2.Show();Prototype p3 = (Prototype)p1.Clone();p3.SetCompany1("華爾街");//p3.Show(); p1.Show();p2.Show();p3.Show();//執(zhí)行客戶端的注釋代碼會(huì)發(fā)現(xiàn)有不同的結(jié)果,所以代碼的執(zhí)行邏輯也必須要理清

? ? ?運(yùn)行結(jié)果:

結(jié)果1:

結(jié)果2:

結(jié)果3:

?

? ? ?代碼的分析:

? ? ? 在客戶端代碼中p2沒(méi)有調(diào)用構(gòu)造方法,而是調(diào)用p1的clone方法,所以內(nèi)存中沒(méi)有產(chǎn)生新的對(duì)象,p2引用p1的對(duì)象。當(dāng)p2修改company時(shí),p1的company也發(fā)生改變。p3同樣調(diào)用p1的clone方法,但是p3使用SetCompany1來(lái)設(shè)置company,在SetCompany1的內(nèi)部并不是直接給company賦值,而是重新克隆company,賦值給company字段,所以p3修改并沒(méi)有將p1,p2的修改覆蓋。出現(xiàn)運(yùn)行結(jié)果1。

? ? ? 在調(diào)整代碼的執(zhí)行順序之后,可以看到p2的修改似乎沒(méi)有影響p1(如結(jié)果2),但其實(shí)p2的修改已經(jīng)影響了p1,只是p1的輸出在前面執(zhí)行。于是在結(jié)果3中可以看到修改。

? ? ? 從以上代碼及其結(jié)果,不難看出是深拷貝和淺拷貝以及代碼的執(zhí)行順序的影響。

? ? ? 原源碼(大話設(shè)計(jì)模式P88)是通過(guò)在私有的構(gòu)造函數(shù)中克隆WorkExperience,并將克隆體賦值給自己,從而產(chǎn)生區(qū)別。大話設(shè)計(jì)模式P87有深拷貝,淺拷貝的介紹。

? ? ? 結(jié)合C++的知識(shí),淺拷貝是將新對(duì)象的指針指向原有的對(duì)象,不再?gòu)?fù)制原有對(duì)象。深拷貝是將原有對(duì)象復(fù)制一個(gè)份,讓新對(duì)象的指針指向復(fù)制后的地址。(如下附圖)

? ? ? 結(jié)合C#的知識(shí),淺拷貝是新對(duì)象引用原有對(duì)象,內(nèi)存中沒(méi)有產(chǎn)生新的對(duì)象。深拷貝是在內(nèi)存中開(kāi)辟空間創(chuàng)建對(duì)象,并將原有對(duì)象的值復(fù)制,新對(duì)象引用內(nèi)存中新產(chǎn)生的對(duì)象,只是與原有對(duì)象的值一致,從內(nèi)存地址上看和原有對(duì)象沒(méi)有關(guān)系。? ? ?

? ? ? 應(yīng)用的場(chǎng)景:

? ? ? 從代碼角度來(lái)說(shuō),避免創(chuàng)建對(duì)象時(shí)的初始化過(guò)程(如果這個(gè)過(guò)程占用的時(shí)間和資源都非常多),或者是希望避免使用工廠方法來(lái)實(shí)現(xiàn)多態(tài)的時(shí)候,可以考慮原型模式。

  從應(yīng)用角度來(lái)說(shuō), 如果你創(chuàng)建的對(duì)象是多變化、多等級(jí)的產(chǎn)品,或者產(chǎn)品的創(chuàng)建過(guò)程非常耗時(shí)的時(shí)候(比如,有一定的計(jì)算量,或者對(duì)象創(chuàng)建時(shí)需要從網(wǎng)絡(luò)或數(shù)據(jù)庫(kù)中獲取一定的數(shù)據(jù)),或者想把產(chǎn)品的創(chuàng)建獨(dú)立出去,不想了解產(chǎn)品創(chuàng)建細(xì)節(jié)的時(shí)候可以考慮使用。

? ? ?注意事項(xiàng):

? ? ?深拷貝和淺拷貝的使用場(chǎng)景,哪些是公有的允許修改的,哪些是不允許修改的。值類型和引用類型在深淺拷貝中的結(jié)果是不一樣的。

? ? ?拷貝原型并進(jìn)行修改意味著原型需要公開(kāi)更多的數(shù)據(jù),對(duì)已有系統(tǒng)實(shí)現(xiàn)原型模式可能修改的代價(jià)比較大。

附圖:

部分內(nèi)容摘自 ? http://www.cnblogs.com/promise-7/archive/2012/06/01/2530734.html

菜鳥(niǎo)D希望這篇文章對(duì)您有所幫助。

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

總結(jié)

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

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