一、概念
抽象工厂模式就是能够生成工厂类的模式。类似于在工厂模式上再加一层封装,负责生成各种各样的工厂,可以视为建厂子的模式。
二、抽象工厂的使用
当一个工厂模式中生产的类有多重组合方式,例如工厂生产水果茶,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 可能生成另一组产品,如牛奶、杯子。
因此工厂方法模式、抽象工厂模式最大的区别在于:
工厂方法模式:针对的是 一个产品等级结构。
抽象工厂模式:针对 多个产品等级结构。
三、总结
抽象工厂作为基类,并设计好了这一类工厂应该具有的特征,每类工厂继承基类,并实现基类的生产函数即可。