工厂模式
medium设计模式创建型简单工厂工厂方法抽象工厂
核心思想
工厂模式将对象的创建和使用分离。调用方不需要知道具体创建哪个类的实例,只需要告诉工厂"我需要什么"。
比喻:你去饭店点菜(告诉工厂要什么),不需要自己去厨房做(不需要 new 具体对象)。
三种工厂模式
1. 简单工厂
一个工厂类根据参数决定创建哪种产品:
public class ShapeFactory {
public static Shape createShape(String type) {
switch (type) {
case "circle": return new Circle();
case "rectangle": return new Rectangle();
case "triangle": return new Triangle();
default: throw new IllegalArgumentException();
}
}
}
// 使用
Shape shape = ShapeFactory.createShape("circle");
缺点:新增产品需修改工厂代码 → 违反开闭原则。
2. 工厂方法
每种产品对应一个工厂,通过多态决定实例化哪个产品:
// 抽象工厂
public interface ShapeFactory {
Shape createShape();
}
// 具体工厂
public class CircleFactory implements ShapeFactory {
public Shape createShape() { return new Circle(); }
}
public class RectangleFactory implements ShapeFactory {
public Shape createShape() { return new Rectangle(); }
}
// 使用
ShapeFactory factory = new CircleFactory();
Shape shape = factory.createShape();
优点:新增产品只需新增一个工厂类,不修改现有代码 → 符合开闭原则。
3. 抽象工厂
创建一组相关的产品族(多个维度的产品):
// 抽象工厂(创建一组相关产品)
public interface UIFactory {
Button createButton();
TextField createTextField();
}
// Windows 风格产品族
public class WindowsFactory implements UIFactory {
public Button createButton() { return new WindowsButton(); }
public TextField createTextField() { return new WindowsTextField(); }
}
// macOS 风格产品族
public class MacFactory implements UIFactory {
public Button createButton() { return new MacButton(); }
public TextField createTextField() { return new MacTextField(); }
}
三种工厂对比
| 模式 | 工厂数量 | 产品数量 | 开闭原则 | 适用场景 |
|---|---|---|---|---|
| 简单工厂 | 1 个 | 多个 | ❌ 违反 | 产品种类少且固定 |
| 工厂方法 | 每产品 1 个 | 一个维度 | ✅ 遵守 | 产品种类可能扩展 |
| 抽象工厂 | 每产品族 1 个 | 多个维度 | ✅ 遵守 | 产品族(跨平台 UI 等) |
生产高频题
简单工厂和工厂方法的区别?
简单工厂用一个工厂类 + switch 创建所有产品,新增产品要改工厂代码。工厂方法为每种产品定义独立的工厂类,新增产品只需新增工厂,不修改现有代码,符合开闭原则。