1. 抽象工厂模式概述
抽象工厂模式(Abstract Factory Pattern)是面向对象编程中最具代表性的创建型设计模式之一。它提供了一种封装一组具有共同主题但实现细节不同的工厂的方式,而无需指定它们的具体类。这种模式在需要创建一系列相关或相互依赖对象时特别有用。
我第一次接触抽象工厂模式是在开发一个跨平台的UI组件库时。当时需要为Windows、MacOS和Linux三个平台提供外观一致但底层实现不同的按钮、文本框和菜单控件。如果为每个平台都单独编写创建逻辑,代码会变得难以维护。抽象工厂模式完美解决了这个问题,它让我能够通过统一的接口创建不同风格的产品族。
关键理解:抽象工厂模式的核心价值在于它能创建"产品族"(一组相关或依赖的对象),而普通工厂方法只能创建单一产品。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模式结构与核心组件
2.1 UML类图解析
抽象工厂模式的典型结构包含以下核心角色:
- AbstractFactory(抽象工厂):声明创建抽象产品对象的接口
- ConcreteFactory(具体工厂):实现抽象工厂的接口,创建具体的产品对象
- AbstractProduct(抽象产品):声明产品对象的接口
- ConcreteProduct(具体产品):实现抽象产品接口的具体类
mermaid复制classDiagram
class AbstractFactory {
+createProductA()
+createProductB()
}
class ConcreteFactory1 {
+createProductA()
+createProductB()
}
class ConcreteFactory2 {
+createProductA()
+createProductB()
}
class AbstractProductA {
+operationA()
}
class ProductA1 {
+operationA()
}
class ProductA2 {
+operationA()
}
AbstractFactory <|-- ConcreteFactory1
AbstractFactory <|-- ConcreteFactory2
AbstractProductA <|-- ProductA1
AbstractProductA <|-- ProductA2
ConcreteFactory1 --> ProductA1
ConcreteFactory1 --> ProductB1
ConcreteFactory2 --> ProductA2
ConcreteFactory2 --> ProductB2
2.2 代码实现示例
以下是一个跨平台UI组件库的Java实现示例:
java复制// 抽象产品接口
interface Button {
void render();
}
interface TextField {
void display();
}
// 具体产品实现 - Windows风格
class WindowsButton implements Button {
public void render() {
System.out.println("Rendering a Windows style button");
}
}
class WindowsTextField implements TextField {
public void display() {
System.out.println("Displaying a Windows style text field");
}
}
// 具体产品实现 - MacOS风格
class MacOSButton implements Button {
public void render() {
System.out.println("Rendering a MacOS style button");
}
}
class MacOSTextField implements TextField {
public void display() {
System.out.println("Displaying a MacOS style text field");
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
TextField createTextField();
}
// 具体工厂
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public TextField createTextField() {
return new WindowsTextField();
}
}
class MacOSFactory implements GUIFactory {
public Button createButton() {
return new MacOSButton();
}
