Skip to content

抽象工厂模式

一、基础定义与定位

  1. 升级关系:工厂方法模式仅支持单一产品等级生产,抽象工厂是其升级方案,可一次性生产多等级配套产品,也被称为“工厂的工厂”;
  2. 核心两大概念
    • 产品等级:同一类别的产品,如咖啡、甜品、手机、电脑分别为独立产品等级;
    • 产品族:同一品牌/风味下成套配套的全部产品,如美式风味包含美式咖啡+抹茶慕斯,小米产品族包含小米手机+小米电脑;
  3. 核心作用:约束客户端只能使用同一产品族内的配套对象,保证产品搭配统一。

二、抽象工厂四大核心角色

  1. 抽象工厂 AbstractFactory 定义全部产品等级对应的创建接口,一个接口方法对应一类产品,规定该产品族需要产出的所有产品;
  2. 具体工厂 ConcreteFactory 代表完整独立产品族,实现抽象工厂所有创建方法,统一生产同风味/同品牌全套配套产品;
  3. 抽象产品 AbstractProduct 每个产品等级对应一套独立抽象接口,定义该类产品通用行为规范;
  4. 具体产品 ConcreteProduct 实现对应等级抽象产品,归属某一个产品族,由对应产品工厂实例化创建。

三、咖啡甜品业务完整案例

业务场景

咖啡店拓展业务,同时售卖咖啡、甜品两类产品等级,划分两大产品族:

  • 美式风味产品族:美式咖啡、抹茶慕斯
  • 意大利风味产品族:拿铁咖啡、提拉米苏

1. 抽象产品(两类产品等级)

java
// 咖啡产品等级接口
public interface Coffee {
    String getName();
}
// 甜品产品等级接口
public interface Dessert {
    void show();
}

2. 具体产品实现

java
// 美式咖啡
public class AmericanCoffee implements Coffee {
    @Override
    public String getName() {
        return "美式咖啡";
    }
}
// 拿铁咖啡
public class LatteCoffee implements Coffee {
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

// 抹茶慕斯
public class MatchaMousse implements Dessert {
    @Override
    public void show() {
        System.out.println("抹茶慕斯");
    }
}
// 提拉米苏
public class Tiramisu implements Dessert {
    @Override
    public void show() {
        System.out.println("提拉米苏");
    }
}

3. 抽象风味工厂

java
public interface FlavorFactory {
    Coffee createCoffee();
    Dessert createDessert();
}

4. 产品族具体工厂

java
// 美式风味工厂
public class AmericanFlavorFactory implements FlavorFactory {
    @Override
    public Coffee createCoffee() {
        return new AmericanCoffee();
    }
    @Override
    public Dessert createDessert() {
        return new MatchaMousse();
    }
}
// 意大利风味工厂
public class ItalyFlavorFactory implements FlavorFactory {
    @Override
    public Coffee createCoffee() {
        return new LatteCoffee();
    }
    @Override
    public Dessert createDessert() {
        return new Tiramisu();
    }
}

5. 客户端调用示例

java
// 选择意大利风味全套产品
FlavorFactory factory = new ItalyFlavorFactory();
Coffee coffee = factory.createCoffee();
Dessert dessert = factory.createDessert();

四、优缺点分析

优点

  1. 强制约束客户端使用同一产品族配套产品,产品搭配统一,不会出现混搭冲突;
  2. 新增完整产品族仅新增一套工厂类与对应产品类,原有代码无需修改,符合开闭原则。

缺点

如果业务需要新增全新产品等级,必须修改抽象工厂接口,所有已存在的具体工厂都要同步修改,严重违背开闭原则。

五、三大工厂模式完整总结(面试背诵版)

  1. 简单工厂:单工厂类统一创建全部产品,新增产品需要修改工厂代码,违反开闭原则,多用于入门练习;
  2. 工厂方法:仅支持单一产品等级,一类产品对应一个独立工厂,新增产品仅新增类,符合开闭原则,项目开发使用最多;
  3. 抽象工厂:适配多等级成套产品族,新增产品族满足开闭,新增产品等级会破坏开闭,企业日常开发使用较少; 三者核心目标均为解耦,分离对象创建与业务使用逻辑。

六、面试简答

问:介绍抽象工厂模式,以及三种工厂模式的区别?

答:抽象工厂是工厂方法的升级,用于生产多等级成套产品,分为产品族和产品等级两大概念,包含抽象工厂、具体工厂、抽象产品、具体产品四大角色。它可以保证客户端始终使用同一产品族配套产品,但新增产品等级时所有工厂都要修改,破坏开闭原则。 简单工厂只有一个工厂,扩展要改代码;工厂方法单一产品一对一工厂,符合开闭,项目最常用;抽象工厂适合成套多维度产品,新增产品族符合开闭,新增产品等级不符合开闭,业务使用较少。三种模式核心都是解耦对象创建逻辑。

Powered by VitePress 1.6.4 | 持续更新中