前言
本文主要講述原型模式,文中使用通俗易懂的案例,使你更好的學(xué)習(xí)本章知識(shí)點(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)過,也是江帥所喜歡的中國神話人物之一,哪吒雖然沒有孫悟空會(huì)身外身法,但是他會(huì)三頭六臂,通過這個(gè)法術(shù),哪吒會(huì)變換出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中克隆新的對象會(huì)產(chǎn)生相同的引用,改變克隆對象的內(nèi)容會(huì)改變到原型對象,這個(gè)屬于淺拷貝,就像咱們的案例,如果用的是淺拷貝,打印結(jié)果會(huì)是3個(gè)武器都是來自太上老君的紫金紅葫蘆。
而使用原型模式克隆出來的對象則跟原型對象不是同一個(gè)地址,改變克隆對象不會(huì)影響原型對象,這個(gè)屬于深拷貝,如案例所示每個(gè)對象里的內(nèi)容不會(huì)因?yàn)閯e的對象的改變而改變。文章來源:http://www.zghlxwxcb.cn/news/detail-474496.html
下一章,將帶大家學(xué)習(xí)市場供需關(guān)系(設(shè)計(jì)模式之生產(chǎn)者和消費(fèi)者模式)。文章來源地址http://www.zghlxwxcb.cn/news/detail-474496.html
到了這里,關(guān)于如何以孫悟空七十二變?nèi)ダ斫庠湍J??的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!