抽象工厂模式:创建产品族的设计模式
一、模式核心:统一创建相关产品族,解耦复杂对象组合
在软件开发中,当需要创建一组相关或依赖的对象(如 "汽车工厂" 同时生产 "发动机" 和 "轮胎"),且不同产品族(如 "燃油车" 和 "电动车")的对象组合存在差异时,简单工厂模式已无法满足需求。
抽象工厂模式(Abstract Factory Pattern) 提供一个创建 "产品族" 的接口,每个具体工厂负责创建特定产品族的所有对象。例如,燃油车工厂创建燃油发动机和橡胶轮胎,电动车工厂创建电动发动机和防滑轮胎。核心解决:
- 产品族解耦:客户端无需知道具体产品类,只需依赖抽象接口。
- 一致性保证:确保同一产品族的对象兼容(如发动机与轮胎适配)。
- 扩展性增强:新增产品族时,只需实现新的具体工厂,不影响现有代码。
核心角色
- 抽象工厂(Abstract Factory) :声明创建产品族的接口(如
createEngine()
、createTire()
)。 - 具体工厂(Concrete Factory) :实现抽象工厂接口,创建特定产品族的对象(如
FuelCarFactory
、ElectricCarFactory
)。 - 抽象产品(Abstract Product) :定义产品族中对象的公共接口(如
Engine
、Tire
)。 - 具体产品(Concrete Product) :实现抽象产品接口,属于特定产品族(如
FuelEngine
、ElectricTire
)。
核心思想与 UML 类图

二、核心实现:汽车工厂生产发动机与轮胎
1. 定义抽象产品接口
发动机接口
java
public interface Engine {
void start(); // 启动发动机
}
轮胎接口
java
public interface Tire {
void inflate(); // 给轮胎充气
}
2. 实现具体产品类
燃油发动机(燃油车产品族)
java
public class FuelEngine implements Engine {
@Override
public void start() {
System.out.println("燃油发动机启动:轰鸣声");
}
}
电动发动机(电动车产品族)
java
public class ElectricEngine implements Engine {
@Override
public void start() {
System.out.println("电动发动机启动:静音");
}
}
橡胶轮胎(燃油车产品族)
java
public class RubberTire implements Tire {
@Override
public void inflate() {
System.out.println("给橡胶轮胎充气至2.5Bar");
}
}
防滑轮胎(电动车产品族)
java
public class AntiSlipTire implements Tire {
@Override
public void inflate() {
System.out.println("给防滑轮胎充气至2.8Bar");
}
}
3. 定义抽象工厂接口
java
public interface CarFactory {
Engine createEngine(); // 创建发动机
Tire createTire(); // 创建轮胎
}
4. 实现具体工厂类
燃油车工厂
java
public class FuelCarFactory implements CarFactory {
@Override
public Engine createEngine() {
return new FuelEngine(); // 返回燃油发动机
}
@Override
public Tire createTire() {
return new RubberTire(); // 返回橡胶轮胎
}
}
电动车工厂
java
public class ElectricCarFactory implements CarFactory {
@Override
public Engine createEngine() {
return new ElectricEngine(); // 返回电动发动机
}
@Override
public Tire createTire() {
return new AntiSlipTire(); // 返回防滑轮胎
}
}
5. 客户端调用
java
public class ClientDemo {
public static void main(String[] args) {
// 创建燃油车工厂并生产部件
CarFactory fuelFactory = new FuelCarFactory();
Engine fuelEngine = fuelFactory.createEngine();
Tire fuelTire = fuelFactory.createTire();
System.out.println("燃油车部件:");
fuelEngine.start(); // 输出:燃油发动机启动:轰鸣声
fuelTire.inflate(); // 输出:给橡胶轮胎充气至2.5Bar
// 创建电动车工厂并生产部件
CarFactory electricFactory = new ElectricCarFactory();
Engine electricEngine = electricFactory.createEngine();
Tire electricTire = electricFactory.createTire();
System.out.println("\n电动车部件:");
electricEngine.start(); // 输出:电动发动机启动:静音
electricTire.inflate(); // 输出:给防滑轮胎充气至2.8Bar
}
}
输出结果:
plaintext
燃油车部件:
燃油发动机启动:轰鸣声
给橡胶轮胎充气至2.5Bar
电动车部件:
电动发动机启动:静音
给防滑轮胎充气至2.8Bar
三、抽象工厂模式 vs 工厂模式
对比维度 | 工厂模式 | 抽象工厂模式 |
---|---|---|
处理对象 | 单一产品类型 | 多个相关产品组成的产品族 |
工厂职责 | 创建单个产品 | 创建一个产品族的所有产品 |
扩展性 | 新增产品需修改工厂类 | 新增产品族只需新建工厂 |
复杂度 | 简单 | 复杂(适合大型系统) |
典型场景 | 日志器、数据库连接 | 跨平台 UI 组件、汽车生产线 |
四、适用场景
场景 | 示例 | 优势 |
---|---|---|
多产品族的系统 | 操作系统界面(Windows/macOS 的按钮 + 窗口) | 统一创建同风格的所有组件 |
产品族内对象需协同工作 | 发动机与轮胎必须适配 | 确保同一工厂的产品兼容 |
需屏蔽产品实现细节 | 客户端无需知道具体部件类型 | 依赖抽象接口,降低耦合度 |
五、总结
抽象工厂模式通过 "工厂创建产品族" 的设计,解决了复杂系统中多产品协同创建的问题。它在 Java Swing(跨平台组件工厂)、Spring 框架(BeanFactory)中均有应用,但需注意:若产品族频繁新增产品(如新增 "变速箱"),会导致抽象工厂接口频繁修改,此时可结合工厂方法模式优化。
扩展思考:
- 如何使用反射机制动态加载具体工厂?
- 抽象工厂模式与依赖注入(DI)有何关联?