一、概念
抽象工廠模式就是能夠生成工廠類的模式。類似於在工廠模式上再加一層封裝,負責生成各種各樣的工廠,可以視爲建廠子的模式。
二、抽象工廠的使用
當一個工廠模式中生產的類有多重組合方式,例如工廠生產水果茶,A廠產烏龍蜜桃茶,B廠產鐵觀音櫻桃茶,因此在抽象工廠類(作爲父類)中寫入茶+水果的組合,至於具體的哪種茶和哪種水果則交給由抽象工廠派生出來的A廠(子類)和B廠(子類)去搞定。
下面一段代碼說明:
假設我們有 A、B 兩個廚房。每個廚房都由餐具和食物組成,但具體組成不同,比如刀子和蘋果、杯子和牛奶。
interface Food {
public String getFoodName();
}
interface TableWare {
public String getToolName();
}
// 抽象工廠
interface KitchenFactory {
public Food getFood();
public TableWare getTableWare();
}
class Apple implements Food{
public String getFoodName() {
return "apple";
}
}
class Knife implements TableWare {
public String getToolName() {
return "knife";
}
}
class AKitchen implements KitchenFactory {
public Food getFood() {
return new Apple();
}
public TableWare getTableWare() {
return new Knife();
}
}
public class Foodaholic {
public void eat(KitchenFactory k) {
System.out.println("A foodaholic is eating "+ k.getFood().getFoodName()
+ " with " + k.getTableWare().getToolName() );
}
public static void main(String[] args) {
Foodaholic fh = new Foodaholic();
KitchenFactory kf = new AKitchen();
fh.eat(kf);
}
}
如上,每個餐廳由餐具和食物組成,而具體的組成又不相同,因此使用一個抽象工廠類,並派生出A和B餐廳。使用時由抽象工廠類來執行具體的工作。另外這裏抽象工廠類並未負責工廠類的生成工作。
另外複製一段網上的話:
爲了解釋得更清楚,先介紹兩個概念:
產品等級結構:比如一個抽象類是食物,其子類有蘋果、牛奶等等,則抽象食物與具體食物名稱之間構成了一個產品等級結構。食物是抽象的父類,而具體的食物名稱是其子類。
產品族:在抽象工廠模式中,產品族是指由同一個工廠生產的,位於不同產品等級結構中的一組產品。如 AKitchen 生產的蘋果、刀子,蘋果屬於食物產品等級結構中,而刀子則屬於餐具產品等級結構中。而 BKitchen 可能生成另一組產品,如牛奶、杯子。
因此工廠方法模式、抽象工廠模式最大的區別在於:
工廠方法模式:針對的是 一個產品等級結構。
抽象工廠模式:針對 多個產品等級結構。
三、總結
抽象工廠作爲基類,並設計好了這一類工廠應該具有的特徵,每類工廠繼承基類,並實現基類的生產函數即可。