1. 程式人生 > >06 抽象工廠模式(Abstract Factory Pattern)

06 抽象工廠模式(Abstract Factory Pattern)

隔了兩三天,今天在複習兩個設計模式。

描述性文字

上節通過奶茶店的例子引入了簡單工廠模式與工廠方法模式, 本節我們來繼續通過這個例子引出抽象工廠模式!

程式碼示例

package abstractFactoryPattern;

import java.util.Random;

/**
 * 抽象工廠模式測試例程
 * @Package       abstractFactoryPattern
 * @Title:        AbstractFactoryPattern.java
 * @Company:      $
 * @author        BurgessLee 
 * @date          2018年10月15日-下午3:38:08
 * @Description:  $
 */
public class AbstractFactoryPattern {
	
	public static void main(String[] args) {
		//初始化兩個小弟
		MakeFood makeFood1 = new FirstXiaoDi();
		MakeFood makeFood2 = new SecondXiaoDi();
		
		for(int i = 0; i < 4; i++){
			System.out.println("訂單配餐======================");
			Drink drink = buyDrink() == 0 ? makeFood1.createMakeDrink() : makeFood2.createMakeDrink();
			Snack snack = buySnack() == 0 ? makeFood1.createMakeSnack() : makeFood2.createMakeSnack();
			
			drink.drink();
			snack.snack();
		}
	}
	
	private static int buyDrink(){
		return new Random().nextInt(2);
	}
	
	private static int buySnack(){
		return new Random().nextInt(2);
	}
	
}

abstract class Drink{
	public abstract void drink();
}

abstract class Snack{
	public abstract void snack();
}

class MilkTea extends Drink{
	@Override
	public void drink() {
		System.out.println("一杯奶茶");
	}
}

class Juice extends Drink{
	@Override
	public void drink() {
		System.out.println("一杯果汁");
	}
}

class HandGab extends Snack{
	@Override
	public void snack() {
		System.out.println("一個手抓餅");
	}
}

class FishBoll extends Snack{
	@Override
	public void snack() {
		System.out.println("一碗魚蛋");
	}
}

abstract class MakeFood{
	abstract Drink createMakeDrink();
	abstract Snack createMakeSnack();
}

class FirstXiaoDi extends MakeFood{

	@Override
	Drink createMakeDrink() {
		return new MilkTea();
	}

	@Override
	Snack createMakeSnack() {
		return new HandGab();
	}
	
}

class SecondXiaoDi extends MakeFood{

	@Override
	Drink createMakeDrink() {
		return new Juice();
	}

	@Override
	Snack createMakeSnack() {
		return new FishBoll();
	}
	
}

執行結果如下:

訂單配餐======================
一杯果汁
一個手抓餅
訂單配餐======================
一杯果汁
一碗魚蛋
訂單配餐======================
一杯果汁
一個手抓餅
訂單配餐======================
一杯果汁
一碗魚蛋

以上就是抽象工廠模式的測試例程了。

兩個名詞(產品等級結構與產品族)

產品等級結構(繼承):

產品的繼承結構,比如這裡的抽象類是Drink(飲料),子類有 奶茶,果汁,然後抽象飲料與具體飲料構成了一個產品等級結構,抽象飲料是父類,具體飲料是其子類。

產品族

同一工廠生產的,位於不同產品等級結構的一組產品,比如這裡 的奶茶和果汁屬於飲料結構的一組產品,而手抓餅和魚蛋則屬於小吃結構的一組產品。

UML類圖


 

 

 

 

 

 

 

 

 

 

 

如圖所示,抽象工廠模式就是由四個角色組成:

抽象工廠:宣告一組用於建立產品族的方法,每個方法對應一種產品;
具體工廠:實現抽象工廠建立產品的方法,生成具體產品;
抽象產品

:為每種產品宣告介面,在抽象產品中聲明瞭產品所具有的業務方法;
具體產品:抽象產品的具體化,實現抽象產品的相關方法;

使用場景與優缺點


使用場景

建立的物件有多個相互關聯或依賴的產品族

優點

1.隔離具體類的生成,客戶端無需知道怎麼被建立,介面與實現分離
2.增加新的產品族很方便,無須修改已有系統,符合”開閉原則”


缺點

1.類檔案增加
2.擴充套件新的產品等級結構麻煩,需要修改抽象工廠,實現抽象工廠的具體工廠類都要更改!