设计模式-抽象工厂模式

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

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

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

  • 工厂方法模式更关注单一类型的产品创建,通过继承和多态性扩展产品种类。
  • 抽象工厂模式更关注一系列相关的产品家族的创建,适用于需要跨产品线保持一致性的情况,比如不同操作系统的界面组件、不同规格的产品系列等。
  • 工厂方法模式的结构相对简单,抽象工厂模式涉及的类和接口更多,因此更适用于产品结构较为复杂、有多种产品组合需要维护的场景。
相关推荐
好奇的菜鸟1 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
DuelCode2 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社22 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
幽络源小助理2 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码2 小时前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot
YuTaoShao3 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
Dcs3 小时前
超强推理不止“大”——手把手教你部署 Mistral Small 3.2 24B 大模型
java
东阳马生架构4 小时前
订单初版—1.分布式订单系统的简要设计文档
java
Code blocks4 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
荔枝吻4 小时前
【沉浸式解决问题】idea开发中mapper类中突然找不到对应实体类
java·intellij-idea·mybatis