## 一、抽象工厂模式概念
抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。该模式围绕一个超级工厂创建其他工厂,将工厂的创建也进行了抽象化。
**核心思想:**
- 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
- 将客户端与具体类的实现分离
- 支持产品族的创建
## 二、代码解析
### 场景示例:跨平台UI组件
假设我们需要为不同操作系统(Windows、Mac)创建一套UI组件(按钮、文本框)。
### 1. 抽象产品接口
```java
// 按钮接口
interface Button {
void render();
}
// 文本框接口
interface TextField {
void display();
}
```
### 2. 具体产品实现
```java
// Windows按钮
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("渲染Windows风格按钮");
}
}
// Mac按钮
class MacButton implements Button {
@Override
public void render() {
System.out.println("渲染Mac风格按钮");
}
}
// Windows文本框
class WindowsTextField implements TextField {
@Override
public void display() {
System.out.println("显示Windows风格文本框");
}
}
// Mac文本框
class MacTextField implements TextField {
@Override
public void display() {
System.out.println("显示Mac风格文本框");
}
}
```
### 3. 抽象工厂接口
```java
interface GUIFactory {
Button createButton();
TextField createTextField();
}
```
### 4. 具体工厂实现
```java
// Windows工厂
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextField createTextField() {
return new WindowsTextField();
}
}
// Mac工厂
class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextField createTextField() {
return new MacTextField();
}
}
```
### 5. 客户端使用
```java
public class Client {
private Button button;
private TextField textField;
public Client(GUIFactory factory) {
this.button = factory.createButton();
this.textField = factory.createTextField();
}
public void renderUI() {
button.render();
textField.display();
}
public static void main(String[] args) {
// 根据配置选择工厂
GUIFactory factory;
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
factory = new WindowsFactory();
} else {
factory = new MacFactory();
}
Client client = new Client(factory);
client.renderUI();
}
}
```
## 三、与工厂方法模式的区别
| 特性 | 工厂方法模式 | 抽象工厂模式 |
|------|-------------|-------------|
| **创建对象数** | 单个产品对象 | 多个相关产品对象(产品族) |
| **抽象层次** | 单一产品创建的抽象 | 多个产品创建的抽象 |
| **扩展性** | 易于添加新产品 | 添加新产品族容易,添加新产品类型困难 |
| **使用场景** | 创建单一类型对象 | 创建相关对象家族 |
| **复杂度** | 相对简单 | 相对复杂 |
**关键区别示例:**
- 工厂方法模式:创建单一对象,如创建按钮
- 抽象工厂模式:创建相关对象组,如同时创建按钮、文本框、菜单等
## 四、源码应用实例
在Java标准库中,抽象工厂模式的应用并不明显,但在Spring框架中可以找到类似的思想:
```java
// Spring中的BeanFactory可以看作是一种抽象工厂
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取相关的Bean对象
UserService userService = factory.getBean(UserService.class);
OrderService orderService = factory.getBean(OrderService.class);
```
## 五、总结
抽象工厂模式的优点:
- 隔离了具体类的生成
- 易于交换产品系列
- 保证客户端始终只使用同一个产品族中的对象
缺点:
- 难以支持新种类的产品
- 增加了系统的抽象性和理解难度
适用场景:
- 系统需要独立于产品的创建、组合和表示
- 系统需要配置多个产品族中的一个
- 需要提供一个产品类库,只暴露接口而不是实现
如若转载,请注明出处:http://www.w-share.com/product/215.html
更新时间:2025-10-20 23:41:12