Skip to content

简单工厂模式

一、原始代码存在的问题(咖啡门店案例)

原始实现

咖啡店CoffeeStoreorderCoffee方法内部直接写if-else判断创建咖啡:

java
public static Coffee orderCoffee(String type){
    Coffee coffee = null;
    if("american".equals(type)){
        coffee = new AmericanCoffee();
    }else if("latte".equals(type)){
        coffee = new LatteCoffee();
    }
    coffee.addMilk();
    coffee.addSugar();
    return coffee;
}

核心缺陷

  1. 违背开闭原则:新增摩卡、卡布奇诺等咖啡时,必须修改orderCoffee方法的if-else分支;
  2. 高耦合:业务门店直接依赖所有具体咖啡实现类,创建逻辑与业务逻辑混杂;
  3. 复用性差:多处需要创建咖啡时,重复复制if-else创建代码。

二、简单工厂模式核心定义

三大角色

  1. 抽象产品:抽象父类/接口(Coffee),定义产品统一规范(getName()addMilk()addSugar());
  2. 具体产品:实现抽象产品的子类(AmericanCoffee美式、LatteCoffee拿铁);
  3. 具体工厂:单独工厂类SimpleCoffeeFactory,提供唯一创建产品的方法createCoffee(String type),封装所有对象实例化逻辑。

UML结构关系

  1. 依赖(虚线箭头):CoffeeStore门店依赖工厂、工厂依赖抽象咖啡Coffee
  2. 泛化(实线空心三角):AmericanCoffeeLatteCoffee继承抽象Coffee
  3. 调用流程:门店下单 → 调用工厂创建咖啡 → 工厂返回对应咖啡实例。

三、案例完整代码实现

1. 抽象产品 Coffee

java
public abstract class Coffee {
    public abstract String getName();
    public void addMilk(){}
    public void addSugar(){}
}

2. 具体产品

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

3. 简单工厂类 SimpleCoffeeFactory

java
public class SimpleCoffeeFactory {
    public Coffee createCoffee(String type){
        Coffee coffee = null;
        if("american".equals(type)){
            coffee = new AmericanCoffee();
        }else if("latte".equals(type)){
            coffee = new LatteCoffee();
        }
        return coffee;
    }
}

4. 业务门店 CoffeeStore

java
public class CoffeeStore {
    private SimpleCoffeeFactory factory = new SimpleCoffeeFactory();
    public Coffee orderCoffee(String type){
        Coffee coffee = factory.createCoffee(type);
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }
}

四、简单工厂模式优缺点

优点

  1. 解耦:业务层(门店)不再直接new具体产品,创建逻辑统一交给工厂;
  2. 代码复用:所有需要创建咖啡的地方统一调用工厂,无需重复创建逻辑;
  3. 职责单一:工厂只负责对象创建,门店只负责下单业务流程。

缺点

  1. 依然违反开闭原则:新增咖啡品类,必须修改工厂createCoffee里的if-else;
  2. 工厂类职责过重:所有产品创建逻辑集中在一个类,一旦创建逻辑出错,全部产品创建受影响;
  3. 产品类型过多时,工厂代码臃肿难以维护。

五、面试简答

问:什么是简单工厂模式,解决了什么问题,有什么缺点? 答:

  1. 组成:分为抽象产品、具体产品、工厂类三个角色,工厂封装所有对象实例化逻辑;
  2. 解决问题:将业务代码中分散的new创建逻辑抽离,解耦业务层与具体实现类,统一管理对象创建;
  3. 缺点:新增产品时必须修改工厂类代码,违背开闭原则,工厂类职责过于集中,维护成本高。

Powered by VitePress 1.6.4 | 持续更新中