抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式是一种创建型设计模式,它能够创建一系列相关或依赖的对象,而无需指定它们的具体类。抽象工厂模式通过提供一个接口来创建多个产品族中的对象,从而确保这些对象是相互兼容的。

模式结构

  1. 抽象产品(Abstract Product)
    定义产品族的接口,声明产品的方法。
  2. 具体产品(Concrete Product)
    实现抽象产品接口,表示具体的产品对象。
  3. 抽象工厂(Abstract Factory)
    定义创建产品族中各个对象的接口。
  4. 具体工厂(Concrete Factory)
    实现抽象工厂的接口,创建具体产品族的对象。

代码示例

1. 抽象产品(Abstract Product)

// 抽象产品A:交换机接口
interface Exchange {
    void company();
}

// 抽象产品B:路由器接口
interface Router {
    void company();
}

2. 具体产品(Concrete Product)

// 具体产品A1:华为交换机
class HuaWeiExchange implements Exchange {
    @Override
    public void company() {
        System.out.println("华为交换机");
    }
}

// 具体产品A2:华三交换机
class H3CExchange implements Exchange {
    @Override
    public void company() {
        System.out.println("华三交换机");
    }
}

// 具体产品B1:华为路由器
class HuaWeiRouter implements Router {
    @Override
    public void company() {
        System.out.println("华为路由器");
    }
}

// 具体产品B2:华三路由器
class H3CRouter implements Router {
    @Override
    public void company() {
        System.out.println("华三路由器");
    }
}

3. 抽象工厂(Abstract Factory)

// 抽象工厂:定义创建交换机与路由器的方法
interface NetworkDeviceFactory {
    Exchange createExchange();
    Router createRouter();
}

4. 具体工厂(Concrete Factory)

// 具体工厂1:华为工厂
class HuaWeiFactory implements NetworkDeviceFactory {
    @Override
    public Exchange createExchange() {
        return new HuaWeiExchange();
    }

    @Override
    public Router createRouter() {
        return new HuaWeiRouter();
    }
}

// 具体工厂2:华三工厂
class H3CFactory implements NetworkDeviceFactory {
    @Override
    public Exchange createExchange() {
        return new H3CExchange();
    }

    @Override
    public Router createRouter() {
        return new H3CRouter();
    }
}

5.调用示例

public class AbstractFactoryPattern {
    public static void main(String[] args) {
        // 随机选择工厂
        NetworkDeviceFactory factory;
        List<String> companys = new ArrayList<>();
        companys.add("huawei");
        companys.add("h3c");
        Collections.shuffle(companys);

        if ("huawei".equals(companys.get(0))) {
            factory = new HuaWeiFactory();
        } else {
            factory = new H3CFactory();
        }

        // 使用工厂创建产品
        factory.createExchange().company();
        factory.createRouter().company();
    }
}

应用场景

  1. 产品族的需求
    当系统需要创建一系列相关或依赖的对象时,可以使用抽象工厂模式。例如,创建不同品牌的电子设备(如手机、耳机、充电器)。
  2. 跨平台兼容性
    当系统需要支持多个平台(如Windows、macOS、Linux)时,可以使用抽象工厂模式来创建与平台兼容的对象。
  3. 避免客户端与具体类耦合
    当客户端代码需要与多个产品族交互,但不需要知道具体类时,可以使用抽象工厂模式。

在Java中的应用

  • Java GUI库(Swing/AWT)
    javax.swing 包中的 LookAndFeel 类是一个抽象工厂,它定义了创建按钮、文本框等UI组件的方法。不同的 LookAndFeel 实现(如 MetalLookAndFeelWindowsLookAndFeel)创建不同风格的UI组件。
  • JDBC
    java.sql.Connection 接口可以看作是一个抽象工厂,它定义了创建 StatementPreparedStatement 等对象的方法。不同的数据库驱动(如MySQL、PostgreSQL)提供了具体的实现。

优缺点

优点

  1. 产品族的一致性
    抽象工厂模式确保同一工厂创建的产品是相互兼容的。
  2. 解耦
    客户端代码与具体产品的实现解耦,只需依赖抽象接口。
  3. 开闭原则
    添加新的产品族时,只需添加新的具体工厂和产品类,无需修改现有代码。

缺点

  1. 复杂性增加
    每增加一个产品族,都需要增加新的抽象产品和具体产品类,可能导致类数量过多。
  2. 扩展困难
    如果需要添加新的产品类型(如新增一个产品C),则需要修改抽象工厂及其所有具体工厂类,违反了开闭原则。

总结

抽象工厂模式通过提供一个接口来创建一系列相关或依赖的对象,确保这些对象是相互兼容的。它适用于需要创建产品族的场景,尤其是在跨平台兼容性和产品一致性方面。尽管它可能会导致类数量增加和扩展困难,但其优点在于提高了代码的可维护性和灵活性。在Java中,抽象工厂模式广泛应用于GUI库和JDBC等场景。