如何讓孩子愛(ài)上設(shè)計(jì)模式 —— 4.原型模式(Prototype Pattern)

標(biāo)簽: 設(shè)計(jì)模式初涉


使用場(chǎng)景

簡(jiǎn)單點(diǎn)說(shuō)就是克隆對(duì)象邀窃!適用場(chǎng)景如下:

  • 1.當(dāng)初始化類對(duì)象需要消耗非常多資源家坎,或者說(shuō)要進(jìn)行繁瑣
    的數(shù)據(jù)準(zhǔn)備或者權(quán)限牍陌,如果想簡(jiǎn)化創(chuàng)建疮茄,可以使用原型模式埂陆。
  • 2.一個(gè)對(duì)象提供給其他對(duì)象訪問(wèn),而各個(gè)調(diào)用者可能都需要
    修改對(duì)象的值娃豹,可以考慮使用原型模式克隆多個(gè)對(duì)象供調(diào)用者
    使用(保護(hù)性拷貝)

組成部分(三個(gè)角色):

  • Prototype —— 聲明一個(gè)克隆自身的接口焚虱,用于約束想要
    克隆自己的類,要求實(shí)現(xiàn)定義的克隆方法懂版。
  • ConcretePrototype —— 實(shí)現(xiàn)Prototype接口的類鹃栽,這些類
    真正實(shí)現(xiàn)克隆自身的相關(guān)代碼。
  • Client —— 客戶端用戶躯畴,調(diào)用類

UML類圖如下


Java中的 == 與 equals 的區(qū)別

  • ==民鼓,如果是對(duì)比的基本數(shù)據(jù)類型(int,long等),比較存儲(chǔ)的值是否相等蓬抄,
    如果對(duì)比的是引用型的變量丰嘉,比較的是所指向的對(duì)象地址是否相等

  • equals,不能用于比較基本數(shù)據(jù)類型嚷缭,如果沒(méi)對(duì)equals()方法進(jìn)行
    重寫(xiě)饮亏,比較的是指向的對(duì)象地址,如果想要比較對(duì)象內(nèi)容阅爽,需要自行重寫(xiě)
    方法路幸,做相應(yīng)的判斷!8段獭<螂取!String調(diào)equals是可以判斷內(nèi)容是否一樣百侧,是
    因?yàn)閷?duì)equals()方法進(jìn)行了重寫(xiě)砰识,具體自己參見(jiàn)源碼!


克隆必須滿足的條件(三個(gè))

  • 1.對(duì)任何的對(duì)象x佣渴,都有:x.clone()!=x 辫狼,即不是同一對(duì)象、
  • 2.對(duì)任何的對(duì)象x观话,都有:x.clone().getClass==x.getClass()予借,即對(duì)象類型一致
  • 3.如果對(duì)象obj的equals()方法定義恰當(dāng)?shù)脑捲狡剑敲?strong>obj.clone().equals(obj)
    應(yīng)當(dāng)是成立的频蛔。(推薦灵迫,不強(qiáng)制)

Java中如何使用:

Prototype原型類(想被克隆的類)實(shí)現(xiàn)Cloneable接口,重寫(xiě)clone()方法晦溪。
調(diào)用:
ConcretePrototype cp1 = new ConcretePrototype();
ConcretePrototype cp2 = (ConcretePrototype)cp1.clone();


示例代碼

通過(guò)一個(gè)示例代碼來(lái)學(xué)習(xí)用法瀑粥,以及驗(yàn)證一些疑問(wèn)

1.供引用的類:Money.java

2.實(shí)現(xiàn)Cloneable接口的類:Assets.java,核心就是重寫(xiě)clone方法而已

3.調(diào)用類:Wealth.java

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

結(jié)果分析得出結(jié)論

  • 1.執(zhí)行克隆方法三圆,不會(huì)調(diào)用構(gòu)造方法
  • 2.克隆會(huì)生成的新的對(duì)象變量狞换,指向的卻是同一個(gè)內(nèi)存地址
  • 3.克隆前后數(shù)據(jù)類型一致舟肉!
  • 4.克隆的時(shí)候修噪,類中基本數(shù)據(jù)類型的屬性會(huì)新建,但是引用類型
    只會(huì)生成個(gè)新的引用變量路媚,引用變量的地址依舊指向同一個(gè)內(nèi)存地址黄琼!

深淺拷貝與實(shí)現(xiàn)深拷貝的兩種簡(jiǎn)單套路

上面這種只新建基本類型數(shù)據(jù)不新建引用類型數(shù)據(jù)整慎,稱為淺拷貝脏款,
如果連引用類型數(shù)據(jù)也新建的話,則稱為深拷貝裤园。

深拷貝的其中一種實(shí)現(xiàn)套路是撤师,引用類型也實(shí)現(xiàn)Cloneable接口,然后實(shí)現(xiàn)clone方法

比如讓Money類也實(shí)現(xiàn)Cloneable接口拧揽,重寫(xiě)clone方法:

然后Assets類剃盾,clone方法那里調(diào)這個(gè)方法,為money對(duì)象賦值:

再運(yùn)行一遍淤袜,運(yùn)行結(jié)果:

好的万俗,結(jié)果創(chuàng)建了新的對(duì)象,沒(méi)毛病饮怯,另外這種方法實(shí)現(xiàn)深拷貝
如果屬性的類型也是對(duì)象闰歪,那么需要一直遞歸的克隆下去!蓖墅!
要想深度克隆成功库倘,必須要整個(gè)克隆所涉及的對(duì)象都要正確實(shí)
現(xiàn)克隆方法,如果其中有一個(gè)沒(méi)有正確實(shí)現(xiàn)克隆论矾,那么就會(huì)導(dǎo)致克隆失敗教翩。

這就是深拷貝的其中一種實(shí)現(xiàn)套路,還有另一種套路是 序列化贪壳,
屬性的類型是引用類型的話饱亿,需要實(shí)現(xiàn)Serializable接口,
然后自己寫(xiě)個(gè)方法來(lái)在里面完成對(duì)象轉(zhuǎn)二進(jìn)制流與二進(jìn)制流轉(zhuǎn)
對(duì)象的方法,然后返回克隆后的對(duì)象彪笼!

輸出結(jié)果和上面一致钻注。


優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 1.簡(jiǎn)化對(duì)象創(chuàng)建過(guò)程,當(dāng)對(duì)象創(chuàng)建比較煩瑣時(shí)配猫,可提高創(chuàng)建效率
  • 2.深拷貝可保存對(duì)象狀態(tài)幅恋,可將對(duì)象拷貝后保存起來(lái),需要的時(shí)候恢復(fù)

缺點(diǎn)

  • 1.深拷貝時(shí)泵肄,屬性存在引用類型多層嵌套的話捆交,為了實(shí)現(xiàn)深克隆,每一層
    對(duì)象對(duì)應(yīng)的類都必須支持深克隆腐巢,實(shí)現(xiàn)起來(lái)可能會(huì)比較麻煩

本節(jié)代碼

https://github.com/coder-pig/DesignPatternsExample/tree/master/3.Prototype%20Pattern

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末品追,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冯丙,更是在濱河造成了極大的恐慌诵盼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件银还,死亡現(xiàn)場(chǎng)離奇詭異风宁,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蛹疯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)戒财,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捺弦,你說(shuō)我怎么就攤上這事饮寞。” “怎么了列吼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵幽崩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我寞钥,道長(zhǎng)慌申,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任理郑,我火速辦了婚禮蹄溉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘您炉。我一直安慰自己柒爵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赚爵。 她就那樣靜靜地躺著棉胀,像睡著了一般法瑟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唁奢,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天霎挟,我揣著相機(jī)與錄音,去河邊找鬼驮瞧。 笑死氓扛,一個(gè)胖子當(dāng)著我的面吹牛枯芬,可吹牛的內(nèi)容都是我干的论笔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼千所,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狂魔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起淫痰,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤最楷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后待错,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體籽孙,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年火俄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了犯建。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓜客,死狀恐怖适瓦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谱仪,我是刑警寧澤玻熙,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疯攒,受9級(jí)特大地震影響嗦随,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敬尺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一称杨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筷转,春花似錦姑原、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春唤殴,著一層夾襖步出監(jiān)牢的瞬間般婆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工朵逝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔚袍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓配名,卻偏偏與公主長(zhǎng)得像啤咽,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渠脉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容