【抽象工厂模式】抽象工厂模式是一种创建型设计模式,它提供了一种方式来封装一组具有相同主题或功能的对象的创建过程。该模式通过定义一个抽象工厂接口,让具体的工厂类来实现这个接口,从而为客户端提供统一的接口来创建相关的产品对象。
一、核心思想
抽象工厂模式的核心在于“封装产品族的创建”,即:将不同种类但相关的产品对象的创建过程统一到一个工厂中。这样可以确保客户端代码不依赖于具体产品的实现,而是依赖于抽象接口,从而提高系统的灵活性和可扩展性。
二、适用场景
场景 | 描述 |
多个产品族需要一起使用 | 当系统中存在多个产品族,且这些产品之间有依赖关系时,适合使用抽象工厂模式。 |
需要解耦客户端与具体产品 | 客户端不需要知道具体产品如何被创建,只需通过工厂获取所需对象。 |
系统需要支持多种配置或版本 | 如不同的操作系统界面风格、不同的数据库驱动等。 |
三、结构组成
组件 | 说明 |
抽象工厂(AbstractFactory) | 声明创建一系列产品的方法。 |
具体工厂(ConcreteFactory) | 实现抽象工厂中的方法,负责创建具体产品对象。 |
抽象产品(AbstractProduct) | 定义产品的接口,供具体产品实现。 |
具体产品(ConcreteProduct) | 实际的产品类,由具体工厂创建。 |
四、优点
优点 | 说明 |
封装产品创建逻辑 | 客户端无需关注具体产品的创建细节。 |
提高系统可维护性 | 更换产品族时,只需更换具体工厂,不影响其他部分。 |
支持多产品组合 | 可以同时创建多个相关产品,保证一致性。 |
五、缺点
缺点 | 说明 |
增加系统复杂度 | 引入新的产品族时,需要修改抽象工厂接口。 |
不易扩展新类型 | 如果新增一种产品类型,可能需要修改已有工厂类。 |
六、示例代码(Java)
```java
// 抽象产品A
interface ProductA {
void show();
}
// 抽象产品B
interface ProductB {
void show();
}
// 具体产品A1
class ProductA1 implements ProductA {
public void show() {
System.out.println("Product A1");
}
}
// 具体产品B1
class ProductB1 implements ProductB {
public void show() {
System.out.println("Product B1");
}
}
// 抽象工厂
interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
public ProductA createProductA() {
return new ProductA1();
}
public ProductB createProductB() {
return new ProductB1();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
AbstractFactory factory = new ConcreteFactory1();
ProductA a = factory.createProductA();
ProductB b = factory.createProductB();
a.show();
b.show();
}
}
```
七、总结
关键点 | 内容 |
模式类型 | 创建型 |
核心目的 | 封装产品族的创建,提高系统的灵活性 |
主要优势 | 解耦客户端与具体产品,便于扩展 |
主要劣势 | 新增产品类型时需调整工厂接口 |
适用情况 | 需要创建多个相关产品,且产品间有依赖关系 |
抽象工厂模式是构建灵活、可扩展系统的重要工具之一,尤其在面对多版本、多配置的软件系统中表现出色。