什么是抽象工廠模式
抽象工廠模式提供了 一種模式,可以將一組具有同一主題的單獨的工廠封裝起來。抽象工廠是一個父類工廠,可以創建其他工廠。所以我們可以叫它"工廠的工廠"。
抽象工廠模式例子
我們假設有A,B倆個廚房。每個廚房擁有的餐具和 食品都不一樣,比如刀子和蘋果,杯子和牛奶。
Class: Foodaholic -> void eat(KitchenFactory)
Interface: Food -> String getFoodName()
Interface: TableWare -> String getToolName()
Class: Apple -> String getFoodName()
Class: Milk -> String getFoodName()
Class: Knife -> String getToolName()
Class: Cup -> String getToolName()
Interface: KitchenFactory -> Food getFood(), Tableware getTableware()
Class: AKitchen: -> Food getFood(), Tableware getTableware()
Class: BKitchen -> Food getFood(), Tableware getTableware()
示例代碼
public class Foodaholic {
public void eat(KitchenFactory kf) {
System.out.println("A foodaholic is eating " + kf.getFood().getFoodName()
+ " with " + kf.getTableware().getToolName());
}
public static void main(String[] agrs) {
Foodaholic f = new Foodaholic();
KitchenFactory kf = new AKitchen();
f.eat(kf);
}
}
interface Food {
public String getFoodName();
}
interface Tableware {
public String getToolName();
}
interface KitchenFactory {
public Food getFood();
public Tableware getTableware();
}
class Apple implements Food {
@Override
public String getFoodName() {
return "apple";
}
}
class Knife implements Tableware {
@Override
public String getToolName() {
return "knife";
}
}
class AKitchen implements KitchenFactory {
@Override
public Food getFood() {
return new Apple();
}
@Override
public Tableware getTableware() {
return new Knife();
}
}
運行結果:
抽象工廠模式.png
抽象工廠模式應用
產品分為幾個系列,產品的布局都是類似的,在一個系列中某個位置的產品,在另一個系列中一定有一個對應的產品。存在這樣的產品結構, 這幾個系列中同一位置的產品可能是互斥的,它們是針對不同客戶的解決方案,每個客戶都選其一。
工廠模式和抽象工廠模式區別
這里有倆個概念:
- 產品等級結構:比如一個抽象類是食物,其子類有蘋果,牛奶等,那么抽象食物與具體食物名稱構成了一個產品等級結構。 食物抽象的父類,具體的食物名稱是其子類。
-
產品族:產品族是指由同一個工廠生產的,位于不同產品等級結構中的一組產品。如AKitchen生產的蘋果,刀子, 蘋果屬于食物產品等級結構中,而刀子屬于餐具產品等級結構中。
結論
工廠方法模式:針對的是一個產品等級結構
抽象工廠模式:針對的是多個產品等級結構