盤置青梅,一樽煮酒,二人對坐,開懷暢飲。操以手指玄德,然後自指曰:“天下英雄,唯使君與操耳”。玄德乃以:“一震之威,乃至於此!”應對。一個長歌當嘯,豪氣沖天,指點群雄;一個寄人籬下,一味謙恭,裝孬不折本。此乃曹劉經典的煮酒論英雄。下面有請我們另外兩位英雄——鳴人和比爾.雷澤,這兩個二貨一見面就唾沫橫飛的要大幹一場,最終上演了一場不倫不類的模式論英雄的忍術Vs科技之戰。
這裡不再畫建造者模式、抽象工廠模式和方法模式的UML圖了,如需要了解的可以去看一下小Y前面的文章建造者模式、工廠方法模式、抽象工廠模式
一、模式之戰第一戰—工廠方法模式VS建造者模式
①在工廠方法模式的加持下,直接產生了手持螺旋丸和具備仙人能力的基數龐大的鳴人隊伍。
②在建造者模式的控制下,一個個比爾按照預定的順序生產出各個部分並組裝起來。
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 {
//定義一個要生產的鳴人
private MingRen mingRen;
@Override
public <T extends MingRen> T createMingRen(Class<T> c) {
try {
//生產鳴人
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;
}
}
複製程式碼
⑥生產鳴人
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();
}
}
複製程式碼
鳴人制造工廠能夠源源不斷地生產出手持螺旋丸和進入仙人模式的鳴人,工廠方法模式主要的目的是能夠直接產生一個新的鳴人,具體是手持螺旋丸還是仙人模式的鳴人,則由客戶端決定。也就是說具體怎麼生產、怎麼組裝,這不是工廠方法模式考慮的,工廠方法模式關注的是一個產品的整體。
2.建造法模式建造比爾雷澤
①生產一個比爾需要的部分,即產品
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();
//構建比爾身體
public void setBody(String body){
this.bizzer.setBody(body);
}
//構建比爾的雪茄
public void setCigar(String cigar){
this.bizzer.setCigar(cigar);
}
//構建比爾的武器
public void setArms(String arms) {
this.bizzer.setArms(arms);
}
//得到完整的比爾
public abstract Bizzer getBizzer();
}
複製程式碼
比爾的組成部分上面都已經知道了,具體怎麼組裝就由實現類決定。
③裝備散彈槍的比爾
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;
}
}
複製程式碼
上面兩個具體的建造者,它們都關注了各個部分,它們的主要目的是通過不同的部件,不同的裝配產生不同的複雜物件,最主要的是關心產品的構建順序。
⑤導演類
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();
}
}
複製程式碼
⑥生產比爾雷澤
public class Client {
public static void main(String[] args){
//建造一個手持散彈槍的比爾
Bizzer bizzerOne=Director.getOneBizzer();
//建造一個手持加特林的比爾
Bizzer bizzerTwo=Director.getTwoBizzer();
}
}
複製程式碼
3.兩者的共同點和區別
共同點
工廠方法模式和建造者模式都屬於建立類模式,都是用來建立物件。
區別
-
產品的複雜度不同
工廠方法模式建立的產品一般都是單一性質產品。而建造者模式建立的是一個複合產品,它由各個部件複合組成,部件不同產品物件當然也不同。 -
主要目的不同
工廠方法模式關注的是一個整體,無須關心產品各部分是如何建立出來的;但在建造者模式中,一個產品的產生是依賴各個部件以及裝配的順序,即是關注產品組成部分的建立過程。
二、模式之戰第二戰—抽象工廠模式VS建造者模式
忍術VS科技第一戰比爾雷澤佔了明顯的優勢,在比拼過程中鳴人的優勢是可以快速生產出基數龐大的鳴人群,對比爾進行數量上的壓制;但是比爾這貨優勢在於注重組裝的細節,每個部分都精細化生產,戰鬥力也是不可比擬的,加上強武器的加持,鳴人大軍的正在節節敗退。鳴人怎麼說都是一代梟雄,怎會沒有一兩個壓箱底的絕招呢,只見他口唸咒語、手結手印,更加龐大的加強版的鳴人軍蜂擁而至,重新形成了相抗衡的局面。
1.鳴人的絕招-抽象工廠模式
按照抽象工廠模式,先定義一個鳴人介面,然後仙人模式的鳴人和九喇嘛模式的鳴人都實現鳴人介面,我們從產品等級和產品族去分析,仙人模式和九喇嘛模式屬於同一個產品等級(有N個產品等級就應該有N個實現工廠),仙人模式和九喇嘛模式下面又可以會螺旋丸的和會鳴人連彈的(N個產品族,在抽象工廠類中就要有N個建立方法)。
①鳴人介面
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 {
//建立會連彈的鳴人
public MingRen createMingRenBomb();
//建立會旋螺丸的鳴人
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();
}
}
複製程式碼
⑩開始生產鳴人
public class Client {
public static void main(String[] args){
//分別生產一個仙人模式下的會連彈和會旋螺丸的鳴人
FairyModeMingRenFactory fairyModeMingRenFactory=new FairyModeMingRenFactory();
MingRen mingRenOne=fairyModeMingRenFactory.createMingRenBomb();
mingRenOne.getAbility();
MingRen mingRenTwo=fairyModeMingRenFactory.createMingRenSpiral();
mingRenTwo.getAbility();
}
}
複製程式碼
抽象工廠模式頁注重完整性,一個產品一旦找到一個工廠生產,那就會生產出一個固定的產品,這樣子鳴人的加強版大軍很快就被生產出來了。
2.抽象工廠和建造者模式的區別
- 抽象工廠模式是工廠方法模式的升級版,前面也說了,抽象工廠模式關注產品的整體,而建造者模式則關注構建的過程,兩者的場景因此也大不相同,如果希望遮蔽物件的建立過程,只提供一個封裝良好的物件,則可以選擇抽象工廠模式;如果通過轉配不同的元件和構建的順序可以產生一個新的物件,同時建造者模式建立的是一個複合產品,它由各個部件複合組成。
三、擴充之戰—抽象工廠模式VS工廠方法模式
工廠建立一種產品,抽象工廠建立的是一組產品,是一個產品系列。這裡要注意的是“系列”的意思,也就是說,抽象工廠建立出的一組產品是成套的。 當有一個介面可以有多種實現的時候,可以考慮使用工廠方法來建立例項。 當有一組介面可以有多種實現方案的時候,可以考慮使用抽象工廠建立例項組。