第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);
// 对象的创建被容器管理四、本章小结
工厂模式将对象创建和使用分离。简单工厂适合简单场景,工厂方法适合创建一族产品,抽象工厂适合创建产品族。工厂模式体现了依赖倒置原则。
五、思考与练习
三种工厂模式如何选择?
工厂模式有什么缺点?
如何在框架中应用工厂模式?
工厂模式和策略模式有什么关系?
如何测试使用工厂模式的代码?