設計模式系列之「抽象工廠模式」

YoungManSter發表於2019-02-19

「工廠方法模式」製造出了牛逼哄哄的鳴人,700多集的《火影》讓小Y嗖的一聲跳到了大結局,直接讓鳴人變成了忍界大佬。回想這樣子的鳴人太過乏味了,小Y決定讓鳴人回爐重造,Let's go!

一、製造前的Ready

1.前提

在工廠方法模式準備的條件之下重新制造鳴人,儘可能利用現有的。

2.增加的模組

把鳴人成長階段分為鳴人baby鳴人歐巴兩個階段。

3.製造工廠的改造

現只有一個AbstractMingRenFactory,只能要夠生產出不同模式的鳴人,不能設定不同時期下的鳴人,怎麼辦?把現有的工廠拆分為兩個,鳴人baby工廠鳴人歐巴工廠

4.重新制造鳴人UML

重新造鳴人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

通用抽象工廠UML

3.理解

  • 抽象工廠模式是工廠方法模式的升級版本。

  • 兩個抽象的產品類可以有關係,比如共同繼承或實現一個抽象類或者介面。

  • 抽象工廠類AbstractMingRenFactory的職責是定義baby期鳴人工廠和歐巴期鳴人工廠要實現的職能。鳴人分為仙人模式的鳴人、會多重分身術的鳴人、會旋螺丸的鳴人,因此在抽象工廠中有對應的建立方法。總結起來就是在有N個產品族,在抽象工廠類中就要有N個建立方法。

  • 把鳴人的成長階段分為baby期和歐巴期,那個就相對應有了baby期鳴人工廠和歐巴期鳴人工廠。即有N個產品等級就應該有N個實現工廠類,在每個實現工廠中,實現不同產品族的生產任務。

  • 在場景類中,沒有任何一個方法和實現類有關係,對於一個產品來說,只需要知道它的工廠方法就可以了直接產生一個產品物件,無須關心它的實現類。

4.應用場景

一個物件族有相同的約束,則可以使用抽象工廠模式。就是一個繼承體系中,如果存在著多個等級結構,並且分屬各個等級結構中的實現類之間存在著一定的關聯或者約束,就可以使用抽象工廠模式。

三、抽象工廠模式優缺點

1.優點

  • 良好的封裝性,每個產品的實現類不是高層模組要關心的,主要關心的是介面,只要知道工廠類是什麼就可以建立出一個需要的物件。

  • 產品族內的約束為非公開狀態,具體的產品族內的約束是在工廠內實現的。

2.缺點

  • 產品擴充套件困難。比如要增加一個仙人模式+九喇嘛模式,就是說產品族由原來的3個增加到4個,上面例子需要改動的地方就有很多,AbstractMingRenFactory要增加一個建立方法,兩個製造不同期間鳴人的工廠也需要修改,違反了開閉原則。

四、總結

抽象工廠模式一個非常常用的模式,但是上面也說到抽象工廠模式的缺點就是擴充套件比較困難,違反了開閉原則,這裡說的難擴充套件是針對產品族,即是上面的螺旋丸鳴人、仙人模式鳴人、多重分身術鳴人,而不是針對產品等級,即baby期的鳴人、歐巴期的鳴人,增加一個產品等級是非常簡單的,只需要繼承抽象工廠類即可。

Android技術交流吧

相關文章