淺復(fù)制與深復(fù)制
- 淺復(fù)制被復(fù)制對(duì)象的所有變量都含有與原來(lái)對(duì)象相同的值攒霹,而所有的對(duì)其他對(duì)象的引用仍然只指向原來(lái)的對(duì)象岖圈,換言之盾计,淺復(fù)制默認(rèn)只對(duì)值類型和String類型進(jìn)行復(fù)制羹幸, 對(duì)于引用類型仍然指向原來(lái)的對(duì)象(內(nèi)存地址相同脊髓,修改其中一個(gè)會(huì)影響到所有引用的對(duì)象)。
- 深復(fù)制在淺復(fù)制的基礎(chǔ)上栅受,對(duì)于引用類型的對(duì)象進(jìn)行復(fù)制(內(nèi)存地址不同将硝,深復(fù)制后的所有對(duì)象對(duì)應(yīng)內(nèi)存都是不同值,互相修改不會(huì)印象)
原型模式優(yōu)點(diǎn)
- 根據(jù)客戶端要求實(shí)現(xiàn)動(dòng)態(tài)穿件對(duì)象屏镊,客戶端不需要知道對(duì)象的創(chuàng)建細(xì)節(jié)依疼,便于代碼的維護(hù)和擴(kuò)展。
- 使用原型模式創(chuàng)建的對(duì)象如果比較復(fù)雜闸衫,會(huì)比直接new一個(gè)對(duì)象在性能上好很多涛贯,因?yàn)閛bject的clone是本地方法,直接操縱二進(jìn)制數(shù)據(jù)蔚出,在復(fù)制大對(duì)象的時(shí)候非常明顯弟翘,比如需要在一個(gè)循環(huán)體內(nèi)創(chuàng)建對(duì)象,I假如對(duì)象創(chuàng)建過(guò)程比較復(fù)雜骄酗,使用原型模式可以簡(jiǎn)化步驟稀余。
原型模式的注意事項(xiàng)
使用原型模式復(fù)制對(duì)象不會(huì)調(diào)用類的構(gòu)造方法,因?yàn)閷?duì)象的復(fù)制是通過(guò)內(nèi)存中來(lái)進(jìn)行復(fù)制趋翻,不僅構(gòu)造方法不會(huì)調(diào)用睛琳,訪問(wèn)權(quán)限也會(huì)失效。所以在某種程度上來(lái)講踏烙,原型模式和單例模式是向沖突的师骗。
在使用時(shí)一定要注意深拷貝與淺拷貝的問(wèn)題,clone方法只會(huì)拷貝對(duì)象的基本的數(shù)據(jù)類型和String類型讨惩,對(duì)于數(shù)組辟癌、容器對(duì)象、引用對(duì)象等都不會(huì)拷貝荐捻。如果需要對(duì)數(shù)組 容器對(duì)象黍少,引用對(duì)象進(jìn)行拷貝寡夹,需要另行拷貝。
如果對(duì)象比較復(fù)雜厂置,可以考慮實(shí)現(xiàn)Serializable接口菩掏,通過(guò)序列化和反序列化來(lái)進(jìn)行深拷貝。