2.设计模式-ABSTRACT FACTORY(抽象工厂)

一、模式定义与核心思想

抽象工厂模式(Abstract Factory Pattern) 是一种创建型设计模式,用于封装一组具有相同主题的独立产品族的创建过程。其核心思想是:

  1. 产品族维度:定义同一系列产品的创建接口(如手机+耳机的组合)
  2. 跨平台扩展:支持不同实现方案的快速切换(如小米生态与苹果生态)

与工厂方法模式的区别

  • 工厂方法:针对单一产品等级(如仅生产手机)
  • 抽象工厂:针对多个关联产品等级(同时生产手机、耳机、充电器等)

二、模式组成结构与UML

角色定义

  1. AbstractFactory(抽象工厂)
    • 声明创建产品族中各类产品的接口
  2. ConcreteFactory(具体工厂)
    • 实现抽象工厂接口,生成特定系列的产品
  3. AbstractProduct(抽象产品)
    • 定义产品接口,如Phone、Earphone
  4. ConcreteProduct(具体产品)
    • 实现抽象产品接口的具体类

UML类图结构

classDiagram
    class AbstractFactory {
        <<interface>>
        +createPhone(): AbstractPhone
        +createEarphone(): AbstractEarphone
    }

    class XiaomiFactory {
        +createPhone(): XiaomiPhone
        +createEarphone(): XiaomiEarphone
    }

    class AppleFactory {
        +createPhone(): IPhone
        +createEarphone(): AirPods
    }

    class AbstractPhone {
        <<interface>>
        +call(): void
    }

    class XiaomiPhone {
        +call(): void
    }

    class IPhone {
        +call(): void
    }

    AbstractFactory <|-- XiaomiFactory
    AbstractFactory <|-- AppleFactory
    AbstractPhone <|-- XiaomiPhone
    AbstractPhone <|-- IPhone

image


三、代码实现示例

场景描述:构建跨品牌的电子设备生产体系

  1. 定义抽象产品接口
// 手机抽象接口
interface Phone {
    void makeCall();
    void launchApp();
}

// 耳机抽象接口 
interface Earphone {
    void playMusic();
    void noiseCancel();
}
  1. 创建具体产品实现
// 小米产品线
class XiaomiPhone implements Phone {
    @Override
    public void makeCall() {
        System.out.println("小米手机拨号中...");
    }

    @Override
    public void launchApp() {
        System.out.println("打开MIUI应用商店");
    }
}

class XiaomiEarphone implements Earphone {
    @Override
    public void playMusic() {
        System.out.println("小米耳机播放音乐");
    }

    @Override
    public void noiseCancel() {
        System.out.println("开启小米主动降噪");
    }
}

// 苹果产品线
class IPhone implements Phone { /* 类似小米实现 */ }

class AirPods implements Earphone { /* 类似小米实现 */ }
  1. 构建抽象工厂体系
interface DeviceFactory {
    Phone createPhone();
    Earphone createEarphone();
}

class XiaomiFactory implements DeviceFactory {
    @Override
    public Phone createPhone() {
        return new XiaomiPhone();
    }

    @Override
    public Earphone createEarphone() {
        return new XiaomiEarphone();
    }
}

class AppleFactory implements DeviceFactory { /* 类似小米实现 */ }
  1. 客户端调用示例
public class Client {
    public static void main(String[] args) {
        // 通过配置切换产品族
        DeviceFactory factory = loadFactoryConfig(); 

        Phone phone = factory.createPhone();
        Earphone earphone = factory.createEarphone();

        phone.makeCall();
        earphone.playMusic();
    }

    private static DeviceFactory loadFactoryConfig() {
        // 根据配置文件返回具体工厂
        return new XiaomiFactory(); 
    }
}

四、工业级源码应用案例

1.JDBC数据库驱动
- DriverManager.getConnection()返回特定数据库的连接对象(Connection)
- 不同数据库厂商实现自己的Connection``Statement等接口
- 源码片段:

Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
  1. Spring框架的BeanFactory
    • BeanFactory作为抽象工厂接口
    • ApplicationContext</font>作为具体工厂实现
    • 生产相互关联的Bean对象(如Service与DAO)
  2. Java Persistence API (JPA)
    • EntityManagerFactory</font>作为抽象工厂
    • 生产EntityManager等持久化操作对象
    • 支持Hibernate、EclipseLink等不同实现

五、模式适用场景

  1. 跨平台产品体系:需要支持多套UI主题/多国语言等场景
  2. 产品组合约束:确保创建的对象属于同一系列(如不能混用不同品牌的配件)
  3. 框架扩展需求:允许第三方厂商实现标准接口扩展功能

六、模式优劣分析

优势

  • 强约束性:确保产品族的完整性
  • 高扩展性:新增产品族无需修改已有代码
  • 隐藏细节:客户端仅依赖抽象接口

劣势

  • 类膨胀问题:每新增一个产品族需要增加多个类
  • 扩展产品等级困难:修改抽象工厂接口会影响所有子类

七、设计决策建议

  1. 产品等级稳定时优先使用抽象工厂
  2. 频繁变更产品等级时考虑其他模式(如建造者模式)
  3. 结合依赖注入框架(如Spring)管理具体工厂的创建

通过深入理解抽象工厂模式,开发者可以更好地设计高内聚、低耦合的复杂系统架构。

posted @ 2025-04-12 10:25  雾里看花的少年  阅读(34)  评论(0)    收藏  举报