设计模式-抽象工厂模式

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

抽象工厂模式(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来获取产品...
    }
}

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

  • 工厂方法模式更关注单一类型的产品创建,通过继承和多态性扩展产品种类。
  • 抽象工厂模式更关注一系列相关的产品家族的创建,适用于需要跨产品线保持一致性的情况,比如不同操作系统的界面组件、不同规格的产品系列等。
  • 工厂方法模式的结构相对简单,抽象工厂模式涉及的类和接口更多,因此更适用于产品结构较为复杂、有多种产品组合需要维护的场景。
相关推荐
_GR10 分钟前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
无限大.23 分钟前
c语言200例 067
java·c语言·开发语言
余炜yw24 分钟前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
攸攸太上24 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
Kenny.志27 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
不修×蝙蝠30 分钟前
八大排序--01冒泡排序
java
sky丶Mamba1 小时前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
数据龙傲天1 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
刷帅耍帅1 小时前
设计模式-桥接模式
设计模式·桥接模式
带带老表学爬虫2 小时前
java数据类型转换和注释
java·开发语言