抽象工厂模式(Abstract Factory Pattern)是创建型设计模式中的一种,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。简单来说,就是“工厂的工厂”——它创建的是工厂,而工厂再创建具体的产品。
┌─────────────────┐
│ AbstractFactory │
│ +createButton() │
│ +createCheckbox()│
└─────────┬─────────┘
│
┌────────────────┼─────────────────┐
│ │
┌───────▼──────┐ ┌────────▼─────────┐
│ WinFactory │ │ MacFactory │
│ +createButton() → WinButton │ +createButton() → MacButton
│ +createCheckbox()→ WinCheckbox│ +createCheckbox()→ MacCheckbox
└──────────────┘ └──────────────────┘
关键角色:
1. 抽象工厂(AbstractFactory):声明创建抽象产品的方法
2. 具体工厂(ConcreteFactory):实现创建具体产品的方法
3. 抽象产品(AbstractProduct):为产品声明接口
4. 具体产品(ConcreteProduct):实现抽象产品的接口
开发一个支持多种主题(浅色/深色)的UI系统,需要统一创建按钮、文本框等组件。
`java
// 抽象按钮
interface Button {
void render();
void onClick();
}
// 抽象文本框
interface TextField {
void render();
void input(String text);
}`
`java
// 浅色主题产品
class LightButton implements Button {
@Override
public void render() {
System.out.println("渲染浅色按钮");
}
@Override
public void onClick() {
System.out.println("浅色按钮点击效果");
}
}
class LightTextField implements TextField {
@Override
public void render() {
System.out.println("渲染浅色文本框");
}
@Override
public void input(String text) {
System.out.println("浅色文本框输入: " + text);
}
}
// 深色主题产品
class DarkButton implements Button {
@Override
public void render() {
System.out.println("渲染深色按钮");
}
@Override
public void onClick() {
System.out.println("深色按钮点击效果");
}
}
class DarkTextField implements TextField {
@Override
public void render() {
System.out.println("渲染深色文本框");
}
@Override
public void input(String text) {
System.out.println("深色文本框输入: " + text);
}
}`
interface GUIFactory {
Button createButton();
TextField createTextField();
}
`java
// 浅色主题工厂
class LightThemeFactory implements GUIFactory {
@Override
public Button createButton() {
return new LightButton();
}
@Override
public TextField createTextField() {
return new LightTextField();
}
}
// 深色主题工厂
class DarkThemeFactory implements GUIFactory {
@Override
public Button createButton() {
return new DarkButton();
}
@Override
public TextField createTextField() {
return new DarkTextField();
}
}`
public class ThemeApplication {
private Button button;
private TextField textField;
public ThemeApplication(GUIFactory factory) {
button = factory.createButton();
textField = factory.createTextField();
}
public void renderUI() {
button.render();
textField.render();
}
public void simulateUserInteraction() {
button.onClick();
textField.input("Hello Abstract Factory!");
}
// 测试代码
public static void main(String[] args) {
System.out.println("=== 使用浅色主题 ===");
ThemeApplication lightApp = new ThemeApplication(new LightThemeFactory());
lightApp.renderUI();
lightApp.simulateUserInteraction();
System.out.println("\n=== 使用深色主题 ===");
ThemeApplication darkApp = new ThemeApplication(new DarkThemeFactory());
darkApp.renderUI();
darkApp.simulateUserInteraction();
}
}
`
=== 使用浅色主题 ===
渲染浅色按钮
渲染浅色文本框
浅色按钮点击效果
浅色文本框输入: Hello Abstract Factory!
=== 使用深色主题 ===
渲染深色按钮
渲染深色文本框
深色按钮点击效果
深色文本框输入: Hello Abstract Factory!`
客户端依赖于抽象工厂(GUIFactory)和抽象产品(Button、TextField),而不是具体实现
| 维度 | 工厂方法模式 | 抽象工厂模式 |
|------|-------------|-------------|
| 创建目标 | 单一产品 | 产品家族 |
| 工厂层级 | 一层工厂 | 两层工厂(抽象+具体) |
| 扩展性 | 新增产品需改工厂接口 | 新增产品族容易,新增产品类型难 |
##
抽象工厂模式通过封装具体产品的创建过程,让客户端与具体类解耦,实现了“产品家族”的统一创建。它的强大之处在于能够保证创建的产品相互兼容,特别适合需要保持产品一致性的场景。
记住这个模式的精髓:不要直接new对象,让工厂为你创建;不要依赖具体类,依赖抽象接口。当你需要创建一系列相关对象时,抽象工厂模式是你的得力助手!
如若转载,请注明出处:http://www.w-share.com/product/312.html
更新时间:2026-04-15 04:49:44