设计模式-抽象工厂模式

设计模式-抽象工厂模式介绍:

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在抽象工厂中,客户端使用抽象工厂来获取一组相关的产品对象,而不需要知道具体的产品是如何被创建出来的。

角色和职责:

1 抽象工厂(Abstract Factory)

  • 定义一个接口,声明了一系列用于创建产品的方法,每个方法对应于一种特定类型的产品。
  • 通常是一个接口或者抽象类,包含多个生产不同产品家族的方法。

2 具体工厂(Concrete Factory)

  • 实现了抽象工厂接口,提供了用于生成实际产品的具体逻辑。
  • 根据不同的业务需求,创建并返回相应产品族中的具体产品对象。

3 抽象产品(Abstract Product)

  • 定义了一个或多个产品对象的接口,这些产品属于同一产品等级结构。
  • 可能是抽象类或接口,为一类产品提供了通用接口定义。

4 具体产品(Concrete Product)

  • 是抽象产品接口的具体实现类。
  • 具体工厂通过调用这些具体产品的构造函数或其他方式来创建实例。

工作原理:

  • 客户端代码不直接实例化具体产品对象,而是通过调用抽象工厂提供的方法来获取所需的产品对象。
  • 抽象工厂确保所创建的产品对象是相关的,也就是说,它们可以协同工作,属于同一个产品族。
  • 当系统需要扩展时,只需要增加新的具体工厂和对应的新产品系列即可,原有代码无须修改,从而符合开闭原则。

优点:

  • 将客户程序与具体产品类的实现细节解耦,增强了系统的可扩展性和灵活性。
  • 支持产品族的独立开发,各个产品族之间互不影响。
  • 有利于应对大量产品族以及多种变化的需求场景。

缺点:

  • 增加新产品种类时,需要修改抽象工厂和所有具体工厂的接口及其实现,可能会导致类的数量急剧增加,增加了系统的复杂性。
  • 如果产品之间的关系较复杂,可能使得抽象工厂的设计变得较为困难。

应用场景:

  • 在软件系统中,有多个产品族组成,并且这些产品族间存在一定的关联或依赖关系。
  • 当系统需要独立于具体产品的创建、组合和表示时。
  • 当要强调一系列相关的产品对象的整体性时。

示例代码:

java 复制代码
// 抽象产品
public interface Color {
    String getColor();
}

public interface Shape {
    String getShape();
}

// 具体产品
public class RedColor implements Color {
    @Override
    public String getColor() {
        return "Red";
    }
}

public class BlueColor implements Color {
    @Override
    public String getColor() {
        return "Blue";
    }

public class Circle implements Shape {
    @Override
    public String getShape() {
        return "Circle";
    }
}

public class Square implements Shape {
    @Override
    public String getShape() {
        return "Square";
    }

// 抽象工厂
public interface Factory {
    Color getColor();
    Shape getShape();
}

// 具体工厂
public class PrimaryColorsFactory implements Factory {
    @Override
    public Color getColor() {
        return new RedColor(); // 或者返回 BlueColor
    }

    @Override
    public Shape getShape() {
        return new Circle(); // 或者返回 Square
    }
}

public class SecondaryColorsFactory implements Factory {
    // 创建其他颜色和形状的实现...
}



// 客户端代码
public class Client {
    public static void main(String[] args) {
        Factory primaryColors = new PrimaryColorsFactory();
        System.out.println("Primary Colors Factory: " + primaryColors.getColor().getColor() 
                           + " and " + primaryColors.getShape().getShape());

        Factory secondaryColors = new SecondaryColorsFactory();
        // 使用secondaryColors来获取产品...
    }
}

关于抽象工厂模式工厂方法模式 对比:

  • 工厂方法模式更关注单一类型的产品创建,通过继承和多态性扩展产品种类。
  • 抽象工厂模式更关注一系列相关的产品家族的创建,适用于需要跨产品线保持一致性的情况,比如不同操作系统的界面组件、不同规格的产品系列等。
  • 工厂方法模式的结构相对简单,抽象工厂模式涉及的类和接口更多,因此更适用于产品结构较为复杂、有多种产品组合需要维护的场景。
相关推荐
wellc3 分钟前
SpringBoot集成Flowable
java·spring boot·后端
Hui Baby1 小时前
springAi+MCP三种
java
hsjcjh1 小时前
【MySQL】C# 连接MySQL
java
敖正炀1 小时前
LinkedBlockingDeque详解
java
wangyadong3171 小时前
datagrip 链接mysql 报错
java
untE EADO1 小时前
Tomcat的server.xml配置详解
xml·java·tomcat
ictI CABL1 小时前
Tomcat 乱码问题彻底解决
java·tomcat
敖正炀1 小时前
DelayQueue 详解
java
敖正炀2 小时前
PriorityBlockingQueue 详解
java
shark22222222 小时前
Spring 的三种注入方式?
java·数据库·spring