在软件系统设计中,我们经常面临创建一系列相互关联或依赖的对象的需求。如果将这些对象的创建代码分散在业务逻辑中,会导致代码高度耦合且难以维护。抽象工厂模式(Abstract Factory Pattern)正是为解决这类问题而生。
1. 理解抽象工厂模式
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。其核心在于"产品族"概念——一组具有共同主题的产品对象。
UML核心组成:
- AbstractFactory:声明创建抽象产品的方法
- ConcreteFactory:实现具体产品的创建
- AbstractProduct:声明产品对象的接口
- ConcreteProduct:定义具体产品对象
2. 与工厂方法模式的关键区别
虽然二者都负责对象创建,但抽象工厂模式关注产品家族的创建,而工厂方法模式关注单一产品的创建。抽象工厂通常使用工厂方法实现具体产品的创建,可以说抽象工厂是工厂方法的升级版。
3. 实战示例:跨平台UI组件工厂
假设我们需要开发一个支持Windows和macOS的UI系统,包含按钮和文本框组件。
// 抽象产品:按钮
interface Button {
void render();
}
// 抽象产品:文本框
interface TextBox {
void input(String text);
}
// 抽象工厂
interface GUIFactory {
Button createButton();
TextBox createTextBox();
}
// 具体产品:Windows按钮
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("渲染Windows风格按钮");
}
}
// 具体产品:macOS按钮
class MacOSButton implements Button {
@Override
public void render() {
System.out.println("渲染macOS风格按钮");
}
}
// 具体工厂:Windows组件工厂
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextBox createTextBox() {
return new WindowsTextBox();
}
}
// 客户端代码
public class Application {
private Button button;
private TextBox textBox;
public Application(GUIFactory factory) {
button = factory.createButton();
textBox = factory.createTextBox();
}
public void renderUI() {
button.render();
textBox.input("示例文本");
}
// 使用示例
public static void main(String[] args) {
GUIFactory factory;
String osType = System.getProperty("os.name").toLowerCase();
if (osType.contains("win")) {
factory = new WindowsFactory();
} else {
factory = new MacOSFactory();
}
Application app = new Application(factory);
app.renderUI();
}
}
4. 模式优势与适用场景
优势:
- 确保产品家族的兼容性
- 客户端与具体实现解耦
- 易于交换产品系列
- 符合开闭原则(扩展新产品族)
适用场景:
- 系统需要独立于其产品的创建、组合和表示
- 系统需要配置多个产品族中的一个
- 需要强调一系列相关产品的设计约束
5. 总结
抽象工厂模式通过引入"产品族"概念,将对象创建提升到了新的抽象层次。虽然增加了代码复杂度,但它为大型系统提供了无与伦比的扩展性和维护性。当你的系统需要创建相互关联的产品家族时,抽象工厂是最优雅的解决方案。

被折叠的 条评论
为什么被折叠?



