当前位置: 首页 > 产品大全 > 一文弄懂Java设计模式之抽象工厂模式 图解+换皮肤代码实例+源码解析

一文弄懂Java设计模式之抽象工厂模式 图解+换皮肤代码实例+源码解析

一文弄懂Java设计模式之抽象工厂模式 图解+换皮肤代码实例+源码解析

抽象工厂模式:构建产品家族的蓝图

抽象工厂模式(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系统,需要统一创建按钮、文本框等组件。

1. 定义抽象产品

`java // 抽象按钮 interface Button { void render(); void onClick(); }

// 抽象文本框
interface TextField {
void render();
void input(String text);
}
`

2. 定义具体产品

`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);
}
}
`

3. 定义抽象工厂

interface GUIFactory {
Button createButton();
TextField createTextField();
}

4. 实现具体工厂

`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();
}
}
`

5. 客户端代码

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!
`

源码设计精髓解析

1. 开闭原则体现

  • 对扩展开放:新增主题(如蓝色主题)只需新增工厂和产品类,无需修改现有代码
  • 对修改关闭:客户端代码完全不需要知道具体产品的创建细节

2. 依赖倒置原则

客户端依赖于抽象工厂(GUIFactory)和抽象产品(Button、TextField),而不是具体实现

3. 与工厂方法模式的区别

| 维度 | 工厂方法模式 | 抽象工厂模式 |
|------|-------------|-------------|
| 创建目标 | 单一产品 | 产品家族 |
| 工厂层级 | 一层工厂 | 两层工厂(抽象+具体) |
| 扩展性 | 新增产品需改工厂接口 | 新增产品族容易,新增产品类型难 |

4. 实际应用场景

  • 跨平台UI框架(Windows/Mac/Linux控件)
  • 数据库访问层(MySQL/Oracle连接工厂)
  • 游戏开发(不同风格的角色、道具、场景)
  • 电商系统(不同支付方式、物流渠道组合)

最佳实践建议

✅ 适用场景

  1. 系统需要独立于产品的创建、组合和表示
  2. 系统需要配置多个产品家族中的一个
  3. 需要强调一系列相关产品的约束性使用

⚠️ 注意事项

  1. 产品族扩展困难:新增产品类型(如新增Slider控件)需要修改所有工厂接口
  2. 代码复杂度:随着产品族增多,类的数量会急剧增加
  3. 建议搭配:常与单例模式结合,确保工厂实例唯一

##

抽象工厂模式通过封装具体产品的创建过程,让客户端与具体类解耦,实现了“产品家族”的统一创建。它的强大之处在于能够保证创建的产品相互兼容,特别适合需要保持产品一致性的场景。

记住这个模式的精髓:不要直接new对象,让工厂为你创建;不要依赖具体类,依赖抽象接口。当你需要创建一系列相关对象时,抽象工厂模式是你的得力助手!

如若转载,请注明出处:http://www.w-share.com/product/312.html

更新时间:2026-04-15 04:49:44

产品大全

Top