(資料圖片)
前言本文主要講述原型模式,文中使用通俗易懂的案例,使你更好的學(xué)習(xí)本章知識點(diǎn)并理解原理,做到有道無術(shù)。
一.什么是原型模式原型模式是23種設(shè)計模式中創(chuàng)建型模式的一種,它關(guān)注的是用一個已經(jīng)存在的實例對象作為原型,通過復(fù)制該原型對象來創(chuàng)建一個和原型對象相同的新對象。
二.生活中的原型模式1.孫悟空孫悟空有獨(dú)一無二的法寶如意金箍棒和眾多法術(shù),其中有一個名為身外身法的道術(shù),孫悟空拔身上的毛幻化出另一個自己,這個大家應(yīng)該有印象吧,這個幻化出新的分身就跟設(shè)計模式中的原型模式很相似。
2.哪吒哪吒不管是西游記還是封神榜中都出現(xiàn)過,也是江帥所喜歡的中國神話人物之一,哪吒雖然沒有孫悟空會身外身法,但是他會三頭六臂,通過這個法術(shù),哪吒會變換出2個新的頭顱和2對新的手臂,而這個三頭六臂是以頭或者手臂為參照物變化出來的,就跟設(shè)計模式中的原型模式很相似。
3.漩渦鳴人旋渦鳴人是日本漫畫中火影忍者的人物,影分身之術(shù)是他最厲害的忍術(shù)之一。這個忍術(shù)是能夠變幻出多個相同的自己,以自己為參照物根據(jù)查克拉的量來變幻出不同的數(shù)量,這就跟設(shè)計模式中的原型模式很相似。
三.原型模式的實現(xiàn)接下來江帥以孫悟空的身外身法之術(shù)來舉例,通過原型模式來實現(xiàn)。先創(chuàng)建一個武器類,再創(chuàng)建一個孫悟空的類并實現(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個分身 -- 身外身之術(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)容會改變到原型對象,這個屬于淺拷貝,就像咱們的案例,如果用的是淺拷貝,打印結(jié)果會是3個武器都是來自太上老君的紫金紅葫蘆。
而使用原型模式克隆出來的對象則跟原型對象不是同一個地址,改變克隆對象不會影響原型對象,這個屬于深拷貝,如案例所示每個對象里的內(nèi)容不會因為別的對象的改變而改變。
下一章,將帶大家學(xué)習(xí)市場供需關(guān)系(設(shè)計模式之生產(chǎn)者和消費(fèi)者模式)。
關(guān)鍵詞:
免責(zé)聲明:本網(wǎng)站所有信息,并不代表本站贊同其觀點(diǎn)和對其真實性負(fù)責(zé),投資者據(jù)此操作,風(fēng)險請自擔(dān)。
上一篇: 風(fēng)景在路上作文500字
下一篇:最后一頁
而今年4月,糖酒會期間,舍得酒業(yè)聯(lián)席董事長蒲吉洲對外表示,2023年將
一段時期以來,有網(wǎng)站平臺仿冒國家機(jī)關(guān)及其直屬機(jī)構(gòu)、國有企業(yè)事業(yè)單位
為深入清理處置涉企業(yè)、企業(yè)家虛假不實和侵權(quán)信息,堅決打擊惡意炒作行
針對近期有不法分子以培訓(xùn)班退費(fèi)名義實施詐騙,中消協(xié)提醒消費(fèi)者警惕培
日前,浙江正泰電器股份有限公司(SH601877,簡稱“正泰電器”)發(fā)布公告
新華社北京6月6日電(記者熊豐)最高人民檢察院、公安部、中國海警局6
人民網(wǎng)北京6月6日電(周靜圓)高考是廣大學(xué)子人生中的一次大考,備受社