常用设计模式3:抽象工厂模式(Java)

抽象工厂模式(Abstract Factory Pattern)

1. 简介

抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。它提供了一个接口,用于创建相关的对象家族,而不需要指定它们具体的类。

2. 为什么使用抽象工厂模式?

  • 解耦:客户端代码与具体产品的实现完全分离。
  • 一致性:确保同一产品族的对象能够相互配合。
  • 易于切换:整个产品族可以方便地切换。
  • 开闭原则:可以引入新的产品族,而不需要修改现有的代码。

3. 抽象工厂模式的结构

抽象工厂模式主要包含以下几个角色:

  1. 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法。
  2. 具体工厂(Concrete Factory):实现了抽象工厂的方法来创建具体产品。
  3. 抽象产品(Abstract Product):为一类产品对象声明接口。
  4. 具体产品(Concrete Product):定义一个将被相应具体工厂创建的产品对象。

4. Java 实现示例

让我们通过一个简单的家具制造的例子来说明抽象工厂模式:

4.1 定义抽象产品

// 抽象产品:椅子
public interface Chair {
    void sitOn();
}

// 抽象产品:桌子
public interface Table {
    void putOn();
}

4.2 实现具体产品

// 具体产品:现代风格椅子
public class ModernChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("Sitting on a modern chair");
    }
}

// 具体产品:现代风格桌子
public class ModernTable implements Table {
    @Override
    public void putOn() {
        System.out.println("Putting on a modern table");
    }
}

// 具体产品:维多利亚风格椅子
public class VictorianChair implements Chair {
    @Override
    public void sitOn() {
        System.out.println("Sitting on a victorian chair");
    }
}

// 具体产品:维多利亚风格桌子
public class VictorianTable implements Table {
    @Override
    public void putOn() {
        System.out.println("Putting on a victorian table");
    }
}

4.3 定义抽象工厂

public interface FurnitureFactory {
    Chair createChair();
    Table createTable();
}

4.4 实现具体工厂

// 具体工厂:现代风格家具工厂
public class ModernFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new ModernChair();
    }

    @Override
    public Table createTable() {
        return new ModernTable();
    }
}

// 具体工厂:维多利亚风格家具工厂
public class VictorianFurnitureFactory implements FurnitureFactory {
    @Override
    public Chair createChair() {
        return new VictorianChair();
    }

    @Override
    public Table createTable() {
        return new VictorianTable();
    }
}

4.5 客户端代码

public class Client {
    public static void main(String[] args) {
        // 使用现代风格家具工厂
        FurnitureFactory modernFactory = new ModernFurnitureFactory();
        Chair modernChair = modernFactory.createChair();
        Table modernTable = modernFactory.createTable();

        modernChair.sitOn();
        modernTable.putOn();

        // 使用维多利亚风格家具工厂
        FurnitureFactory victorianFactory = new VictorianFurnitureFactory();
        Chair victorianChair = victorianFactory.createChair();
        Table victorianTable = victorianFactory.createTable();

        victorianChair.sitOn();
        victorianTable.putOn();
    }
}

5. 抽象工厂模式的优缺点

优点:

  • 确保了同一工厂生成的产品相互匹配。
  • 避免了具体产品与客户端代码的耦合。
  • 符合单一职责原则、开闭原则。
  • 易于交换产品系列。

缺点:

  • 代码可能变得比较复杂,因为需要引入许多新的接口和类。
  • 难以支持新种类的产品。需要修改抽象工厂接口,这将涉及到所有的具体工厂。

6. 适用场景

  • 系统需要独立于它的产品的创建、组合和表示时。
  • 系统要由多个产品系列中的一个来配置时。
  • 要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 提供一个产品类库,只想显示它们的接口而不是实现时。

7. 总结

抽象工厂模式提供了一种封装一组一主题的单独的工厂的方法。它在需要创建一系列相互关联或相互依赖的对象时特别有用。通过使用抽象工厂模式,可以确保一个应用程序在不同的系列中始终使用同一个系列的对象,从而保持了系统的一致性。

posted @   KenWan  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示