第7章 原型模式
內(nèi)容來自尚硅谷Java設(shè)計(jì)模式(圖解+框架源碼剖析)_嗶哩嗶哩_bilibili
寫在前面:本文內(nèi)容大致和原視頻內(nèi)老師的筆記內(nèi)容相同,會偶爾插入自己的注釋和理解,盡量會完成作業(yè)
兄弟們!學(xué)就完事了!加油!奧里給!
7.1克隆羊問題
現(xiàn)在有一只羊tom,姓名為: tom,年齡為:1,顏色為:白色,請編寫程序創(chuàng)建和tom羊?qū)傩酝耆嗤?0只羊。
7.2傳統(tǒng)方式解決克隆羊問題
思路分析(圖解)
看老師代碼的演示

7.3傳統(tǒng)方式的優(yōu)缺點(diǎn)
1.????? 優(yōu)點(diǎn)是比較好理解,簡單易操作。
2.????? 在創(chuàng)建新的對象時(shí),總是需要重新獲取原始對象的屬性,如果創(chuàng)建的對象比較復(fù)雜時(shí),效率較低
3.????? 總是需要重新初始化對象,而不是動態(tài)地獲得對象運(yùn)行時(shí)的狀態(tài),不夠靈活
4.????? 改進(jìn)的思路分析
?
思路:Java中 Object類是所有類的根類,Object類提供了一個(gè) clone()方法,該方法可以將一個(gè)Java對象復(fù)制一份,但是需要實(shí)現(xiàn)clone的Java類必須要實(shí)現(xiàn)一個(gè)接口Cloneable,該接口表示該類能夠復(fù)制且具有復(fù)制的能力=>原型模式
7.4原型模式基本介紹
基本介紹
1)????? 原型模式(Prototype模式)是指:用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型,創(chuàng)建新的對象
2)????? 原型模式是一種創(chuàng)建型設(shè)計(jì)模式,允許一個(gè)對象再創(chuàng)建另外一個(gè)可定制的對象,無需知道如何創(chuàng)建的細(xì)節(jié)
3)????? 工作原理是:通過將一個(gè)原型對象傳給那個(gè)要發(fā)動創(chuàng)建的對象,這個(gè)要發(fā)動創(chuàng)建的對象通過請求原型對象拷貝它們自己來實(shí)施創(chuàng)建,即對象.clone()
4)????? 形象的理解:孫大圣拔出猴毛,變出其它孫大圣
7.5原型模式原理結(jié)構(gòu)圖-uml類圖

原理結(jié)構(gòu)圖說明
1)????? Prototype:原型類,聲明一個(gè)克隆自己的接口
2)????? ConcretePrototype:具體的原型類,實(shí)現(xiàn)一個(gè)克隆自己的操作
3)????? Client:讓一個(gè)原型對象克隆自己,從而創(chuàng)建一個(gè)新的對象(屬性一樣
7.6原型模式解決克隆羊問題的應(yīng)用實(shí)例
使用原型模式改進(jìn)傳統(tǒng)方式,讓程序具有更高的效率和擴(kuò)展性。
代碼實(shí)現(xiàn)
7.7原型模式在Spring框架中的源碼分析

7.8深入討論-淺拷貝和深拷貝
7.8.1淺拷貝介紹
對于數(shù)據(jù)類型是基本數(shù)據(jù)類型的成員變量,淺拷貝會直接進(jìn)行值傳遞,也就是將該屬性值復(fù)制一份給新的對象。
對于數(shù)據(jù)類型是引用數(shù)據(jù)類型的成員變量,比如說成員變量是某個(gè)數(shù)組、某個(gè)類的對象等,那么淺拷貝會進(jìn)行引用傳遞,也就是只是將該成員變量的引用值(內(nèi)存地址)復(fù)制一份給新的對象。因?yàn)閷?shí)際上兩個(gè)對象的該成員變量都指向同一個(gè)實(shí)例。在這種情況下,在一個(gè)對象中修改該成員變量會影響到另一個(gè)對象的該成員變量值
前面我們克隆羊就是淺拷貝
淺拷貝是使用默認(rèn)的clone()方法來實(shí)現(xiàn)
sheep = (Sheep) super.clone();
7.8.2深拷貝基本介紹
1)????? 復(fù)制對象的所有基本數(shù)據(jù)類型的成員變量值
2)????? 為所有引用數(shù)據(jù)類型的成員變量申請存儲空間,并復(fù)制每個(gè)引用數(shù)據(jù)類型成員變量所引用的對象,直到該對象可達(dá)的所有對象。也就是說,對象進(jìn)行深拷貝要對整個(gè)對象(包括對象的引用類型)進(jìn)行拷貝
3)????? 深拷貝實(shí)現(xiàn)方式1:重寫clone方法來實(shí)現(xiàn)深拷貝
4)????? 深拷貝實(shí)現(xiàn)方式2:通過對象序列化實(shí)現(xiàn)深拷貝(推薦)
7.9深拷貝應(yīng)用實(shí)例
1)????? 使用重寫clone方法實(shí)現(xiàn)深拷貝
2)????? 使用序列化來實(shí)現(xiàn)深拷貝
3)????? 代碼演示
7.10原型模式的注意事項(xiàng)和細(xì)節(jié)
1)????? 創(chuàng)建新的對象比較復(fù)雜時(shí),可以利用原型模式簡化對象的創(chuàng)建過程,同時(shí)也能夠提高效率
2)????? 不用重新初始化對象,而是動態(tài)地獲得對象運(yùn)行時(shí)的狀態(tài)
3)????? 如果原始對象發(fā)生變化(增加或者減少屬性),其它克隆對象的也會發(fā)生相應(yīng)的變化,無需修改代碼
4)????? 在實(shí)現(xiàn)深克隆的時(shí)候可能需要比較復(fù)雜的代碼
5)????? 缺點(diǎn):需要為每一個(gè)類配備一個(gè)克隆方法,這對全新的類來說不是很難,但對已有的類進(jìn)行改造時(shí),需要修改其源代碼,違背了ocp原則,這點(diǎn)請同學(xué)們注意
兄弟們!學(xué)就完事了!加油!奧里給!