4Head First Design Patterns(第2版)

工厂模式

创建对象

简单工厂工厂方法抽象工厂依赖倒置

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第4章:工厂模式(Factory Pattern)

一、导读

1.1 本章学习目标

第4章讲解工厂模式——一种创建对象的设计模式。工厂模式将对象的创建和使用分离,使系统更加灵活。

1.2 为什么第四章如此重要

工厂模式是最常用的设计模式之一。它封装了对象创建的复杂性,使代码更加灵活和可维护。

1.3 核心问题引导

简单工厂、工厂方法和抽象工厂有什么区别?

工厂模式如何体现依赖倒置原则?

何时使用工厂方法,何时使用抽象工厂?

工厂模式在框架中如何应用?


二、核心概念详解

4.1 简单工厂

java
public class PizzaStore {
    public Pizza orderPizza(String type) {
        Pizza pizza = PizzaFactory.createPizza(type);
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }
}

public class PizzaFactory {
    public static Pizza createPizza(String type) {
        if ("cheese".equals(type)) return new CheesePizza();
        if ("pepperoni".equals(type)) return new PepperoniPizza();
        if ("veggie".equals(type)) return new VeggiePizza();
        throw new IllegalArgumentException("Unknown pizza type: " + type);
    }
}

4.2 工厂方法

java
public abstract class PizzaStore {
    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type);  // 工厂方法
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    protected abstract Pizza createPizza(String type);  // 子类实现
}

public class NYPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        if ("cheese".equals(type)) return new NYStyleCheesePizza();
        if ("pepperoni".equals(type)) return new NYStylePepperoniPizza();
        return null;
    }
}

public class ChicagoPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        if ("cheese".equals(type)) return new ChicagoStyleCheesePizza();
        if ("pepperoni".equals(type)) return new ChicagoStylePepperoniPizza();
        return null;
    }
}

4.3 抽象工厂

java
// 产品族
public interface PizzaIngredientFactory {
    Dough createDough();
    Sauce createSauce();
    Cheese createCheese();
}

// 具体工厂
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
    public Dough createDough() { return new ThinCrustDough(); }
    public Sauce createSauce() { return new MarinaraSauce(); }
    public Cheese createCheese() { return new ReggianoCheese(); }
}

public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory {
    public Dough createDough() { return new ThickCrustDough(); }
    public Sauce createSauce() { return new PlumTomatoSauce(); }
    public Cheese createCheese() { return new MozzarellaCheese(); }
}

4.4 依赖倒置原则

反模式(依赖具体):
PizzaStore → CheesePizza(直接依赖具体类)

正确做法(依赖抽象):
PizzaStore → Pizza(依赖抽象)
     ↑
CheesePizza, PepperoniPizza(具体实现)

工厂方法使依赖倒置成为可能

三、实战案例

3.1 Spring 中的工厂模式

java
// BeanFactory 是工厂模式的典型应用
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
// 对象的创建被容器管理

四、本章小结

工厂模式将对象创建和使用分离。简单工厂适合简单场景,工厂方法适合创建一族产品,抽象工厂适合创建产品族。工厂模式体现了依赖倒置原则。


五、思考与练习

三种工厂模式如何选择?

工厂模式有什么缺点?

如何在框架中应用工厂模式?

工厂模式和策略模式有什么关系?

如何测试使用工厂模式的代码?


4/12工厂模式
0%