盤置青梅煤蚌,一樽煮酒,二人對坐,開懷暢飲铺然。操以手指玄德俗孝,然后自指曰:“天下英雄酒甸,唯使君與操耳”魄健。玄德乃以:“一震之威,乃至于此插勤!”應(yīng)對沽瘦。一個長歌當(dāng)嘯,豪氣沖天农尖,指點群雄析恋;一個寄人籬下,一味謙恭盛卡,裝孬不折本助隧。此乃曹劉經(jīng)典的煮酒論英雄。下面有請我們另外兩位英雄——鳴人和比爾.雷澤滑沧,這兩個二貨一見面就唾沫橫飛的要大干一場并村,最終上演了一場不倫不類的模式論英雄的忍術(shù)Vs科技之戰(zhàn)。
這里不再畫建造者模式滓技、抽象工廠模式和方法模式的UML圖了哩牍,如需要了解的可以去看一下小Y前面的文章建造者模式、工廠方法模式令漂、抽象工廠模式
一膝昆、模式之戰(zhàn)第一戰(zhàn)—工廠方法模式VS建造者模式
①在工廠方法模式的加持下,直接產(chǎn)生了手持螺旋丸和具備仙人能力的基數(shù)龐大的鳴人隊伍叠必。
②在建造者模式的控制下荚孵,一個個比爾按照預(yù)定的順序生產(chǎn)出各個部分并組裝起來。
1.工廠方法模式建造鳴人
①鳴人接口
public interface MingRen {
//鳴人的技能
void getAbility();
}
②手持螺旋丸的鳴人
public class MingRenOfSpiral implements MingRen {
@Override
public void getAbility() {
System.out.println("手持螺旋丸的鳴人纬朝。");
}
}
③仙人模式的鳴人
public class MingRenOfFairy implements MingRen {
@Override
public void getAbility() {
System.out.println("仙人模式的鳴人收叶。");
}
}
④抽象鳴人制造工廠
public abstract class AbstractMingRenFactory {
public abstract <T extends MingRen> T createMingRen(Class<T> c);
}
⑤鳴人制造工廠
public class MingRenFactory extends AbstractMingRenFactory {
//定義一個要生產(chǎn)的鳴人
private MingRen mingRen;
@Override
public <T extends MingRen> T createMingRen(Class<T> c) {
try {
//生產(chǎn)鳴人
mingRen= (MingRen) Class.forName(c.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) mingRen;
}
}
⑥生產(chǎn)鳴人
public class Client {
public static void main(String []args){
//聲明一個鳴人制造工廠
AbstractMingRenFactory mingRenFactory=new MingRenFactory();
//制造一個螺旋丸的鳴人
MingRenOfSpiral mingRenOfSpiral=mingRenFactory.createMingRen(MingRenOfSpiral.class);
mingRenOfFairy.getAbility();
//制造一個仙人模式的鳴人
MingRenOfFairy mingRenOfFairy=mingRenFactory.createMingRen(MingRenOfFairy.class);
mingRenOfFairy.getAbility();
}
}
鳴人制造工廠能夠源源不斷地生產(chǎn)出手持螺旋丸和進入仙人模式的鳴人,工廠方法模式主要的目的是能夠直接產(chǎn)生一個新的鳴人玄组,具體是手持螺旋丸還是仙人模式的鳴人滔驾,則由客戶端決定。也就是說具體怎么生產(chǎn)俄讹、怎么組裝哆致,這不是工廠方法模式考慮的,工廠方法模式關(guān)注的是一個產(chǎn)品的整體患膛。
2.建造法模式建造比爾雷澤
①生產(chǎn)一個比爾需要的部分摊阀,即產(chǎn)品
public class Bizzer {
//比爾的身體
private String body;
//比爾的雪茄
private String cigar;
//比爾的武器
private String arms;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getCigar() {
return cigar;
}
public void setCigar(String cigar) {
this.cigar = cigar;
}
public String getArms() {
return arms;
}
public void setArms(String arms) {
this.arms = arms;
}
}
比爾雷雷澤簡化為三個部分:身體、雪茄、武器胞此。
②抽象建造者
public abstract class Builder {
protected Bizzer bizzer=new Bizzer();
//構(gòu)建比爾身體
public void setBody(String body){
this.bizzer.setBody(body);
}
//構(gòu)建比爾的雪茄
public void setCigar(String cigar){
this.bizzer.setCigar(cigar);
}
//構(gòu)建比爾的武器
public void setArms(String arms) {
this.bizzer.setArms(arms);
}
//得到完整的比爾
public abstract Bizzer getBizzer();
}
比爾的組成部分上面都已經(jīng)知道了臣咖,具體怎么組裝就由實現(xiàn)類決定。
③裝備散彈槍的比爾
public class BizzerOneBuilder extends Builder {
@Override
public Bizzer getBizzer() {
super.setBody("強壯的身軀");
super.setArms("92年的雪茄");
super.setArms("裝備散彈槍");
return super.bizzer;
}
}
④裝備加特林的比爾
public class BizzerTwoBuilder extends Builder {
@Override
public Bizzer getBizzer() {
super.setBody("強壯的身軀");
super.setArms("92年的雪茄");
super.setArms("裝備加特林");
return super.bizzer;
}
}
上面兩個具體的建造者漱牵,它們都關(guān)注了各個部分夺蛇,它們的主要目的是通過不同的部件,不同的裝配產(chǎn)生不同的復(fù)雜對象酣胀,最主要的是關(guān)心產(chǎn)品的構(gòu)建順序刁赦。
⑤導(dǎo)演類
public class Director {
//裝備散彈槍比爾建造者
private static Builder bizzerOneBuilder=new BizzerOneBuilder();
//裝備加特林比爾建造者
private static Builder bizzerTwaoBuilder=new BizzerTwoBuilder();
public static Bizzer getOneBizzer(){
return bizzerOneBuilder.getBizzer();
}
public static Bizzer getTwoBizzer(){
return bizzerTwaoBuilder.getBizzer();
}
}
⑥生產(chǎn)比爾雷澤
public class Client {
public static void main(String[] args){
//建造一個手持散彈槍的比爾
Bizzer bizzerOne=Director.getOneBizzer();
//建造一個手持加特林的比爾
Bizzer bizzerTwo=Director.getTwoBizzer();
}
}
3.兩者的共同點和區(qū)別
共同點
工廠方法模式和建造者模式都屬于創(chuàng)建類模式,都是用來創(chuàng)建對象闻镶。
區(qū)別
產(chǎn)品的復(fù)雜度不同
工廠方法模式創(chuàng)建的產(chǎn)品一般都是單一性質(zhì)產(chǎn)品甚脉。而建造者模式創(chuàng)建的是一個復(fù)合產(chǎn)品,它由各個部件復(fù)合組成铆农,部件不同產(chǎn)品對象當(dāng)然也不同牺氨。主要目的不同
工廠方法模式關(guān)注的是一個整體,無須關(guān)心產(chǎn)品各部分是如何創(chuàng)建出來的墩剖;但在建造者模式中猴凹,一個產(chǎn)品的產(chǎn)生是依賴各個部件以及裝配的順序,即是關(guān)注產(chǎn)品組成部分的創(chuàng)建過程涛碑。
二精堕、模式之戰(zhàn)第二戰(zhàn)—抽象工廠模式VS建造者模式
忍術(shù)VS科技第一戰(zhàn)比爾雷澤占了明顯的優(yōu)勢,在比拼過程中鳴人的優(yōu)勢是可以快速生產(chǎn)出基數(shù)龐大的鳴人群蒲障,對比爾進行數(shù)量上的壓制歹篓;但是比爾這貨優(yōu)勢在于注重組裝的細節(jié),每個部分都精細化生產(chǎn)揉阎,戰(zhàn)斗力也是不可比擬的庄撮,加上強武器的加持,鳴人大軍的正在節(jié)節(jié)敗退毙籽。鳴人怎么說都是一代梟雄洞斯,怎會沒有一兩個壓箱底的絕招呢,只見他口念咒語坑赡、手結(jié)手印烙如,更加龐大的加強版的鳴人軍蜂擁而至,重新形成了相抗衡的局面毅否。
1.鳴人的絕招-抽象工廠模式
按照抽象工廠模式亚铁,先定義一個鳴人接口,然后仙人模式的鳴人和九喇嘛模式的鳴人都實現(xiàn)鳴人接口螟加,我們從產(chǎn)品等級和產(chǎn)品族去分析徘溢,仙人模式和九喇嘛模式屬于同一個產(chǎn)品等級(有N個產(chǎn)品等級就應(yīng)該有N個實現(xiàn)工廠)吞琐,仙人模式和九喇嘛模式下面又可以會螺旋丸的和會鳴人連彈的(N個產(chǎn)品族,在抽象工廠類中就要有N個創(chuàng)建方法)然爆。
①鳴人接口
public interface MingRen {
//鳴人的技能
void getAbility();
}
②仙人模式的會連彈的鳴人
public class FairyModeOfMingRenBomb implements MingRen{
@Override
public void getAbility() {
System.out.println("仙人模式的會連彈的鳴人");
}
}
③仙人模式的會旋螺丸的鳴人
public class FairyModeOfMingRenSpiral implements MingRen{
@Override
public void getAbility() {
System.out.println("仙人模式的會旋螺丸的鳴人");
}
}
④九喇嘛模式的會連彈的鳴人
public class NineLamaOfMingRenBomb implements MingRen{
@Override
public void getAbility() {
System.out.println("九喇嘛模式的會連彈的鳴人");
}
}
⑤九喇嘛模式的會旋螺丸的鳴人
public class NineLamaOfMingRenSpiral implements MingRen{
@Override
public void getAbility() {
System.out.println("九喇嘛模式的會旋螺丸的鳴人");
}
}
⑦抽象工廠
public interface MingRenFactory {
//創(chuàng)建會連彈的鳴人
public MingRen createMingRenBomb();
//創(chuàng)建會旋螺丸的鳴人
public MingRen createMingRenSpiral();
}
⑧仙人模式鳴人工廠
public class FairyModeMingRenFactory implements MingRenFactory {
@Override
public MingRen createMingRenBomb() {
return new FairyModeOfMingRenBomb();
}
@Override
public MingRen createMingRenSpiral() {
return new FairyModeOfMingRenSpiral();
}
}
⑨九喇嘛模式鳴人工廠
public class NineLamaMingRenFactory implements MingRenFactory {
@Override
public MingRen createMingRenBomb() {
return new NineLamaOfMingRenBomb();
}
@Override
public MingRen createMingRenSpiral() {
return new NineLamaOfMingRenSpiral();
}
}
⑩開始生產(chǎn)鳴人
public class Client {
public static void main(String[] args){
//分別生產(chǎn)一個仙人模式下的會連彈和會旋螺丸的鳴人
FairyModeMingRenFactory fairyModeMingRenFactory=new FairyModeMingRenFactory();
MingRen mingRenOne=fairyModeMingRenFactory.createMingRenBomb();
mingRenOne.getAbility();
MingRen mingRenTwo=fairyModeMingRenFactory.createMingRenSpiral();
mingRenTwo.getAbility();
}
}
抽象工廠模式頁注重完整性站粟,一個產(chǎn)品一旦找到一個工廠生產(chǎn),那就會生產(chǎn)出一個固定的產(chǎn)品曾雕,這樣子鳴人的加強版大軍很快就被生產(chǎn)出來了奴烙。
2.抽象工廠和建造者模式的區(qū)別
- 抽象工廠模式是工廠方法模式的升級版,前面也說了翻默,抽象工廠模式關(guān)注產(chǎn)品的整體缸沃,而建造者模式則關(guān)注構(gòu)建的過程,兩者的場景因此也大不相同修械,如果希望屏蔽對象的創(chuàng)建過程,只提供一個封裝良好的對象检盼,則可以選擇抽象工廠模式肯污;如果通過轉(zhuǎn)配不同的組件和構(gòu)建的順序可以產(chǎn)生一個新的對象,同時建造者模式創(chuàng)建的是一個復(fù)合產(chǎn)品吨枉,它由各個部件復(fù)合組成蹦渣。
三、拓展之戰(zhàn)—抽象工廠模式VS工廠方法模式
工廠創(chuàng)建一種產(chǎn)品貌亭,抽象工廠創(chuàng)建的是一組產(chǎn)品柬唯,是一個產(chǎn)品系列。這里要注意的是“系列”的意思圃庭,也就是說锄奢,抽象工廠創(chuàng)建出的一組產(chǎn)品是成套的。
當(dāng)有一個接口可以有多種實現(xiàn)的時候剧腻,可以考慮使用工廠方法來創(chuàng)建實例拘央。
當(dāng)有一組接口可以有多種實現(xiàn)方案的時候,可以考慮使用抽象工廠創(chuàng)建實例組书在。