「工廠方法模式」製造出了牛逼哄哄的鳴人,700多集的《火影》讓小Y嗖的一聲跳到了大結局,直接讓鳴人變成了忍界大佬。回想這樣子的鳴人太過乏味了,小Y決定讓鳴人回爐重造,Let's go!
一、製造前的Ready
1.前提
在工廠方法模式準備的條件之下重新制造鳴人,儘可能利用現有的。
2.增加的模組
把鳴人成長階段分為鳴人baby和鳴人歐巴兩個階段。
3.製造工廠的改造
現只有一個AbstractMingRenFactory,只能要夠生產出不同模式的鳴人,不能設定不同時期下的鳴人,怎麼辦?把現有的工廠拆分為兩個,鳴人baby工廠和鳴人歐巴工廠。
4.重新制造鳴人UML
二、製造鳴人
①MingRen介面是對鳴人的總稱
public interface MingRen {
//鳴人使用不同能力的咒語
void getSpell();
//能力的介紹
void getAbility();
}
複製程式碼
②仙人模式的鳴人
public abstract MingRenOfFairy implements MingRen {
@Override
public void getSpell() {
System.out.println("哦哈喲鍋炸一馬屎~~~");
}
@Override
public void getAbility() {
System.out.println("可以利用自身周圍的自然能量,使攻擊範圍更廣。");
}
}
複製程式碼
③仙人模式的鳴人baby
public class MingRenBabyOfFairy extens MingRenOfFairy {
public void attcak() {
System.out.println("仙人模式處於baby期。");
}
}
複製程式碼
④仙人模式的鳴人歐巴
public class MingRenOBaOfFairy extens MingRenOfFairy {
public void attcak() {
System.out.println("仙人模式處於歐巴期。");
}
}
複製程式碼
⑤螺旋丸的鳴人
public class MingRenOfSpiral implements MingRen {
@Override
public void getSpell() {
System.out.println("瑪尼瑪尼哄~~~");
}
@Override
public void getAbility() {
System.out.println("形成手掌般大小的查克拉球。");
}
}
複製程式碼
⑥螺旋丸的鳴人baby
public class MingRenBabyOfSpiral extens MingRenOfSpiral {
public void Attcak() {
System.out.println("螺旋丸處於baby期。");
}
}
複製程式碼
⑦螺旋丸的鳴人歐巴
public class MingRenOBaOfSpiral iextens MingRenOfSpiral {
public void attcak() {
System.out.println("螺旋丸處於歐巴期。");
}
}
複製程式碼
⑧多重影分身術的鳴人
public class MingRenOfSeparate implements MingRen {
@Override
public void getSpell() {
System.out.println("卡通,阿里噶哆~~~");
}
@Override
public void getAbility() {
System.out.println("一次分出多個影分身。");
}
}
複製程式碼
⑨多重影分身術的鳴人baby
public class MingRenBabyOfSeparate extends MingRenOfSeparate {
public void Attcak() {
System.out.println("多重影分身術處於baby期。");
}
}
複製程式碼
⑩多重影分身術的鳴人歐巴
public class MingRenOBaOfSeparate extends MingRenOfSeparate {
public void attcak() {
System.out.println("多重影分身術處於歐巴期。");
}
}
複製程式碼
⑪定義鳴人工廠
public implements class AbstractMingRenFactory {
//製造一個仙人模式的鳴人
public MingRen createMingRenOfFairy();
//製造一個螺旋丸的鳴人
public MingRen createMingRenOfSpiral();
//製造一個多重影分身術的鳴人
public MingRen createMingRenOfSeparate();
}
複製程式碼
⑫生產baby期鳴人的工廠
public class MingRenBabyFactory implements AbstractMingRenFactory {
public MingRen createMingRenOfFairy(){
return new MingRenOBaOfFairy();
}
public MingRen createMingRenOfSpiral(){
return new MingRenBabyOfSpiral();
}
public MingRen createMingRenOfSeparate(){
return new MingRenBabyOfSeparate();
}
}
複製程式碼
⑬生產歐巴期鳴人的工廠
public class MingRenOBaFactory implements AbstractMingRenFactory {
public MingRen createMingRenOfFairy(){
return new MingRenBabyOfFairy();
}
public MingRen createMingRenOfSpiral(){
return new MingRenOBaOfSpiral();
}
public MingRen createMingRenOfSeparate(){
return new MingRenOBaOfSeparate();
}
}
複製程式碼
⑭Client實現生產鳴人
public class Client {
public static void main(String []args){
//生產baby期的鳴人
MingRenBabyFactory mingRenBabyFactory=new MingRenBabyFactory();
//生產歐巴期的鳴人
MingRenOBaFactory mingRenOBaFactory=new MingRenOBaFactory();
//生產一個baby期的、會多重影分身術的鳴人
MingRen babyMingRenOfSeparate=mingRenBabyFactory.createMingRenOfSeparate();
babyMingRenOfSeparate.getAbility();
babyMingRenOfSeparate.getAbility();
babyMingRenOfSeparate.attcak();
//生產一個歐巴期的、會多重影分身術的鳴人
MingRen oBaMingRenOfSeparate=mingRenOBaFactory.createMingRenOfSeparate();
oBaMingRenOfSeparate.getAbility();
oBaMingRenOfSeparate.getAbility();
oBaMingRenOfSeparate.attcak();
}
}
複製程式碼
⑮輸出結果
//baby期的、會多重影分身術的鳴人
卡通,阿里噶哆~~~
一次分出多個影分身。
多重影分身術處於baby期。
//歐巴期的、會多重影分身術的鳴人
卡通,阿里噶哆~~~
一次分出多個影分身。
多重影分身術處於歐巴期。
複製程式碼
經過一番改造,終於能夠自如的製造出分別在不同期間的不同模式的鳴人。對抽象工廠模式也有一定程度的瞭解了,下面小Y帶大家更加深入的去理解抽象工廠模式。
二、基本概念
1.什麼是抽象工廠模式
為建立一組相關或相互依賴的物件提供一個介面,無須指定它們的具體類。
2.抽象工廠模式通用UML
3.理解
-
抽象工廠模式是工廠方法模式的升級版本。
-
兩個抽象的產品類可以有關係,比如共同繼承或實現一個抽象類或者介面。
-
抽象工廠類AbstractMingRenFactory的職責是定義baby期鳴人工廠和歐巴期鳴人工廠要實現的職能。鳴人分為仙人模式的鳴人、會多重分身術的鳴人、會旋螺丸的鳴人,因此在抽象工廠中有對應的建立方法。總結起來就是在有N個產品族,在抽象工廠類中就要有N個建立方法。
-
把鳴人的成長階段分為baby期和歐巴期,那個就相對應有了baby期鳴人工廠和歐巴期鳴人工廠。即有N個產品等級就應該有N個實現工廠類,在每個實現工廠中,實現不同產品族的生產任務。
-
在場景類中,沒有任何一個方法和實現類有關係,對於一個產品來說,只需要知道它的工廠方法就可以了直接產生一個產品物件,無須關心它的實現類。
4.應用場景
一個物件族有相同的約束,則可以使用抽象工廠模式。就是一個繼承體系中,如果存在著多個等級結構,並且分屬各個等級結構中的實現類之間存在著一定的關聯或者約束,就可以使用抽象工廠模式。
三、抽象工廠模式優缺點
1.優點
-
良好的封裝性,每個產品的實現類不是高層模組要關心的,主要關心的是介面,只要知道工廠類是什麼就可以建立出一個需要的物件。
-
產品族內的約束為非公開狀態,具體的產品族內的約束是在工廠內實現的。
2.缺點
- 產品擴充套件困難。比如要增加一個仙人模式+九喇嘛模式,就是說產品族由原來的3個增加到4個,上面例子需要改動的地方就有很多,AbstractMingRenFactory要增加一個建立方法,兩個製造不同期間鳴人的工廠也需要修改,違反了開閉原則。
四、總結
抽象工廠模式一個非常常用的模式,但是上面也說到抽象工廠模式的缺點就是擴充套件比較困難,違反了開閉原則,這裡說的難擴充套件是針對產品族,即是上面的螺旋丸鳴人、仙人模式鳴人、多重分身術鳴人,而不是針對產品等級,即baby期的鳴人、歐巴期的鳴人,增加一個產品等級是非常簡單的,只需要繼承抽象工廠類即可。