【資料圖】
本文主要講述原型模式,文中使用通俗易懂的案例,使你更好的學(xué)習(xí)本章知識點(diǎn)并理解原理,做到有道無術(shù)。
一.什么是原型模式原型模式是23種設(shè)計(jì)模式中創(chuàng)建型模式的一種,它關(guān)注的是用一個(gè)已經(jīng)存在的實(shí)例對象作為原型,通過復(fù)制該原型對象來創(chuàng)建一個(gè)和原型對象相同的新對象。
二.生活中的原型模式1.孫悟空孫悟空有獨(dú)一無二的法寶如意金箍棒和眾多法術(shù),其中有一個(gè)名為身外身法的道術(shù),孫悟空拔身上的毛幻化出另一個(gè)自己,這個(gè)大家應(yīng)該有印象吧,這個(gè)幻化出新的分身就跟設(shè)計(jì)模式中的原型模式很相似。
2.哪吒哪吒不管是西游記還是封神榜中都出現(xiàn)過,也是江帥所喜歡的中國神話人物之一,哪吒雖然沒有孫悟空會身外身法,但是他會三頭六臂,通過這個(gè)法術(shù),哪吒會變換出2個(gè)新的頭顱和2對新的手臂,而這個(gè)三頭六臂是以頭或者手臂為參照物變化出來的,就跟設(shè)計(jì)模式中的原型模式很相似。
3.漩渦鳴人旋渦鳴人是日本漫畫中火影忍者的人物,影分身之術(shù)是他最厲害的忍術(shù)之一。這個(gè)忍術(shù)是能夠變幻出多個(gè)相同的自己,以自己為參照物根據(jù)查克拉的量來變幻出不同的數(shù)量,這就跟設(shè)計(jì)模式中的原型模式很相似。
三.原型模式的實(shí)現(xiàn)接下來江帥以孫悟空的身外身法之術(shù)來舉例,通過原型模式來實(shí)現(xiàn)。先創(chuàng)建一個(gè)武器類,再創(chuàng)建一個(gè)孫悟空的類并實(shí)現(xiàn)克隆接口
package com.qianfeng.ran;/** @author:江帥* 孫悟空類*/public class SunWuKong implements Cloneable{ //名字 private String name; //武器 private Weapon weapon; public SunWuKong() { } public SunWuKong(String name, Weapon weapon) { this.name = name; this.weapon = weapon; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Weapon getWeapon() { return weapon; } public void setWeapon(Weapon weapon) { this.weapon = weapon; } @Override public String toString() { return "SunWuKong{" + "name="" + name + """ + ", weapon=" + weapon + "}"; } //身外身之術(shù) @Override protected Object clone() throws CloneNotSupportedException { //通過 Object 類的 clone() 克隆出新的孫悟空 SunWuKong sunWuKong = (SunWuKong)super.clone(); //新的分身名等同當(dāng)前名 sunWuKong.setName(name); //新的分身手持同樣的武器,但為新的對象 sunWuKong.setWeapon(new Weapon(weapon.getName(),weapon.getSource())); return sunWuKong; }}/* * @author:江帥 * 武器類 */public class Weapon { //武器名 private String name; //來源 private String source; public Weapon() { } public Weapon(String name, String source) { this.name = name; this.source = source; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSource() { return source; } public void setSource(String source) { this.source = source; } @Override public String toString() { return "Weapon{" + "name="" + name + """ + ", source="" + source + """ + "}"; }}
最后通過原型模式來創(chuàng)建孫悟空的分身。
package com.qianfeng.ran;/* * @author:江帥 * 客戶端 */public class Demo { public static void main(String[] args) throws CloneNotSupportedException { //phantom //創(chuàng)建孫悟空對象,擁有東海龍宮的如意金箍棒 SunWuKong sunWuKong = new SunWuKong("孫悟空",new Weapon("如意金箍棒","東海龍宮")); //調(diào)用克隆方法創(chuàng)建2個(gè)分身 -- 身外身之術(shù) SunWuKong phantom1 = (SunWuKong)sunWuKong.clone(); SunWuKong phantom2 = (SunWuKong)sunWuKong.clone(); //執(zhí)行結(jié)果: //SunWuKong{name="孫悟空", weapon=Weapon{name="如意金箍棒", source="東海龍宮"}} System.out.println(sunWuKong.toString()); //執(zhí)行結(jié)果: //SunWuKong{name="孫悟空", weapon=Weapon{name="如意金箍棒", source="東海龍宮"}} System.out.println(phantom1.toString()); //執(zhí)行結(jié)果: //SunWuKong{name="孫悟空", weapon=Weapon{name="如意金箍棒", source="東海龍宮"}} System.out.println(phantom2.toString()); //改變分身的武器和出產(chǎn)地 phantom1.getWeapon().setName("芭蕉扇"); phantom1.getWeapon().setSource("火焰山"); phantom2.getWeapon().setName("紫金紅葫蘆"); phantom2.getWeapon().setSource("太上老君"); //執(zhí)行結(jié)果: //SunWuKong{name="孫悟空", weapon=Weapon{name="如意金箍棒", source="東海龍宮"}} //執(zhí)行結(jié)果: System.out.println(sunWuKong.toString()); //執(zhí)行結(jié)果: //SunWuKong{name="孫悟空", weapon=Weapon{name="芭蕉扇", source="火焰山"}} System.out.println(phantom1.toString()); //執(zhí)行結(jié)果: //SunWuKong{name="孫悟空", weapon=Weapon{name="紫金紅葫蘆", source="太上老君"}} System.out.println(phantom2.toString()); }}
四.總結(jié)在Java中克隆新的對象會產(chǎn)生相同的引用,改變克隆對象的內(nèi)容會改變到原型對象,這個(gè)屬于淺拷貝,就像咱們的案例,如果用的是淺拷貝,打印結(jié)果會是3個(gè)武器都是來自太上老君的紫金紅葫蘆。
而使用原型模式克隆出來的對象則跟原型對象不是同一個(gè)地址,改變克隆對象不會影響原型對象,這個(gè)屬于深拷貝,如案例所示每個(gè)對象里的內(nèi)容不會因?yàn)閯e的對象的改變而改變。
下一章,將帶大家學(xué)習(xí)市場供需關(guān)系(設(shè)計(jì)模式之生產(chǎn)者和消費(fèi)者模式)。
為您推薦
- (2023-06-07)行業(yè)景氣觀察(0607):家電、家居等618預(yù)售開門紅 5月重卡出口保持強(qiáng)勁
- (2023-06-07)ETF日報(bào)
- (2023-06-07)孩子王(301078):KIDSGPT賦能提升運(yùn)營能力 華北區(qū)域倉網(wǎng)建設(shè)助力全國倉網(wǎng)布局 世界新資訊
- (2023-06-07)報(bào)喜鳥(002154):4Q22受疫情影響 2023年有望重啟開店
- (2023-06-07)滾動(dòng):惠泉啤酒(600573):受益于股東燕京啤酒改革 提效與高端化正蓄力
- (2023-06-07)資本新秩序系列(二):從增長率到股息率|環(huán)球最新
- (2023-06-07)世界熱文:華豐科技(688629)新股覆蓋研究
最近更新
- (2023-06-08)2023年川渝地區(qū)鐵路建設(shè)勞動(dòng)競賽啟動(dòng)
- (2023-06-08)世界要聞:廣東省商務(wù)廳張勁松:廣東自貿(mào)試驗(yàn)區(qū)累計(jì)新設(shè)企業(yè)超過26萬家 實(shí)際利用外資近500億美元
- (2023-06-08)中國5月外匯儲備31765.1億美元|今日訊
- (2023-06-08)大姚縣氣象臺發(fā)布雷電黃色預(yù)警信號【Ⅲ級/較重】【2023-06-07】
- (2023-06-08)庫克回應(yīng)Vision Pro價(jià)格昂貴:這是“最先進(jìn)的電子設(shè)備”
- (2023-06-08)全球熱消息:海關(guān)總署:前5個(gè)月民營企業(yè)進(jìn)出口總額同比增長13.1%
- (2023-06-08)12年一個(gè)周期叫什么_12年一個(gè)輪回叫什么
- (2023-06-08)天天訊息:羅博特科06月07日大漲,股價(jià)創(chuàng)歷史新高
- (2023-06-08)當(dāng)前熱訊:郭布羅婉容成仙了么_郭布羅婉容
- (2023-06-08)直擊高考首日!九江少年,加油! 環(huán)球看點(diǎn)
- (2023-06-08)【聚看點(diǎn)】網(wǎng)絡(luò)原來如此之防火墻應(yīng)用網(wǎng)關(guān)技術(shù)
- (2023-06-08)理想汽車北京順義工廠最早7月投產(chǎn)?官方回應(yīng):確實(shí)在積極準(zhǔn)備中
- (2023-06-08)甘肅省美食產(chǎn)業(yè)發(fā)展現(xiàn)場會暨臨夏美食節(jié)各項(xiàng)籌備工作有序推進(jìn)_全球熱門
- (2023-06-08)世界關(guān)注:外交部:對卡霍夫卡水電站堤壩被破壞表示嚴(yán)重關(guān)切
- (2023-06-07)海南橡膠:公司未參與投資海南萬寧免稅店項(xiàng)目_環(huán)球關(guān)注
- (2023-06-07)環(huán)球熱議:商企攜手助力“三夏” 促豐收
- (2023-06-07)全球今頭條!小學(xué)生“臟”請假條走紅,原因讓人忍俊不禁,老師用六個(gè)字霸氣回應(yīng)
- (2023-06-07)天天快資訊:斷面圖和剖面圖的區(qū)別圖片_斷面圖和剖面圖的區(qū)別
- (2023-06-07)世界快報(bào):新舊動(dòng)能順暢切換,中德企業(yè)探索可持續(xù)發(fā)展合作
- (2023-06-07)湖北宜昌可提供海爾飲水設(shè)備維修服務(wù)地址在哪
- (2023-06-07)通達(dá)創(chuàng)智:現(xiàn)已開發(fā)、銷售適合兒童使用的相關(guān)產(chǎn)品_快看
- (2023-06-07)世界觀熱點(diǎn):冬至吃餃子寓意什么_吃餃子寓意什么
- (2023-06-07)重慶便宜的大專院校排名 重慶學(xué)校大專排名_焦點(diǎn)播報(bào)
- (2023-06-07)熱門看點(diǎn):隔離開關(guān)的作用和特點(diǎn)_隔離開關(guān)的作用
- (2023-06-07)【全球新視野】今日美盤英鎊/美元操作策略分析(2023年6月7日)
- (2023-06-07)視點(diǎn)!重慶建筑科技職業(yè)學(xué)院教務(wù)處組織召開2022年年檢工作教育教學(xué)專題復(fù)盤會
- (2023-06-07)環(huán)球快訊:廣西壯族自治區(qū)富川瑤族自治縣發(fā)布大風(fēng)藍(lán)色預(yù)警
- (2023-06-07)三亞旅文集團(tuán)8億元中期票據(jù)將付息 利率4.27%
- (2023-06-07)抖音回應(yīng)擴(kuò)張自營電商:將根據(jù)用戶需求做一些業(yè)務(wù)嘗試 每日訊息