抽象工厂模式属于创建型模式
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的Creator里加代码,又要在具体的里面加代码。
UML图如下:
// 抽象食物
interface Food {
public String getFoodName();
}
// 抽象餐具
interface TableWare {
public String getToolName();
}
// 抽象工厂
interface KitchenFactory {
public Food getFood();
public TableWare getTableWare();
}
//具体食物 Apple 的定义如下
class Apple implements Food{
public String getFoodName() {
return "apple";
}
}
//具体餐具 Knife 的定义如下
class Knife implements TableWare {
public String getToolName() {
return "knife";
}
}
// 以具体工厂 AKitchen 为例
class AKitchen implements KitchenFactory {
public Food getFood() {
return new Apple();
}
public TableWare getTableWare() {
return new Knife();
}
}
// 客户
public class Customer {
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) {
Customer c = new Customer();
KitchenFactory kf = new AKitchen();
c.eat(kf);
}
}
工厂方法模式、抽象工厂模式区别:
首先先看两个概念:
产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如 AKitchen 生产的苹果、刀子,苹果属于食物产品等级结构中,而刀子则属于餐具产品等级结构中。而 BKitchen 可能生成另一组产品,如牛奶、杯子。
因此工厂方法模式、抽象工厂模式最大的区别在于:
工厂方法模式:针对的是一个产品等级结构。
抽象工厂模式:针对多个产品等级结构。