抽象工厂模式
- §1 概念
- §2 角色
- §3 甜品店案例
-
- §4 优缺点
§1 概念

- 产品族:华为既有华为手机,也有华为电脑、华为平板,华为手机、华为电脑和华为平板属于一个产品族,因为他们都是华为品牌。
- 产品等级:有华为手机,也有苹果手机、小米手机,他们属于一个产品等级,因为他们都是手机,属于手机等级。
- 抽象工厂模式和工厂方法模式的区别在于,工厂方法模式中的工厂创建的具体产品属于同一个产品等级,如:咖啡工厂可以制作美式咖啡、拿铁咖啡,但是不能制作甜点;而抽象工厂模式中的工厂创建的具体产品属于同一个产品族,如华为工厂只生产华为手机、华为电脑、华为平板等,不能生产苹果手机、苹果电脑等。
§2 角色
- 抽象产品:定义产品的规范,描述产品的特性和功能,抽象工厂模式可能存在多个抽象产品,如:咖啡、甜点等。
- 具体产品:实现或继承抽象产品的子类,如:咖啡有美式咖啡、拿铁咖啡,甜点有提拉米苏、抹茶慕斯。
- 抽象工厂:提供创建产品的接口,可以创建不同产品等级的产品,如:甜品工厂既可以制作咖啡,也可以制作甜点。
- 具体工厂:实现抽象工厂接口,完成对某一个产品族产品的生产,如:美式风味甜品工厂制作美式咖啡和抹茶慕斯,意大利风味甜品工厂制作拿铁咖啡和提拉米苏。
§3 甜品店案例
§3.1 类图

§3.2 实现
public abstract class Coffee {
public abstract String getName();
public void getMilk() {
System.out.println("加牛奶");
}
public void addSugar() {
System.out.println("加糖");
}
}
public abstract class Dessert {
public abstract void show();
}
public class AmericanCoffee extends Coffee {
@Override
public String getName() {
return "美式咖啡";
}
}
public class LatteCoffee extends Coffee {
@Override
public String getName() {
return "拿铁咖啡";
}
}
public class Tiramisu extends Dessert {
@Override
public void show() {
System.out.println("提拉米苏");
}
}
public class MatchaMousse extends Dessert {
@Override
public void show() {
System.out.println("抹茶慕斯");
}
}
public interface DessertFactory {
Coffee createCoffee();
Dessert createDessert();
}
public class AmericanDessertFactory implements DessertFactory {
@Override
public Coffee createCoffee() {
return new AmericanCoffee();
}
@Override
public Dessert createDessert() {
return new MatchaMousse();
}
}
public class ItalyDessertFactory implements DessertFactory {
@Override
public Coffee createCoffee() {
return new LatteCoffee();
}
@Override
public Dessert createDessert() {
return new Tiramisu();
}
}
public class Client {
public static void main(String[] args) {
AmericanDessertFactory factory = new AmericanDessertFactory();
Coffee coffee = factory.createCoffee();
Dessert dessert = factory.createDessert();
System.out.println(coffee.getName());
dessert.show();
}
}
§4 优缺点
- 优点:保证客户端使用的是同一个产品族的产品。
- 缺点:当产品族种新增一种产品时,所有的工厂类都需要进行修改。