设计模式-抽象工厂模式

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

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

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

  • 工厂方法模式更关注单一类型的产品创建,通过继承和多态性扩展产品种类。
  • 抽象工厂模式更关注一系列相关的产品家族的创建,适用于需要跨产品线保持一致性的情况,比如不同操作系统的界面组件、不同规格的产品系列等。
  • 工厂方法模式的结构相对简单,抽象工厂模式涉及的类和接口更多,因此更适用于产品结构较为复杂、有多种产品组合需要维护的场景。
相关推荐
Wang's Blog1 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
\光辉岁月/3 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang3 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
郑州光合科技余经理3 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071573 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat3 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源3 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog3 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
HEJOO94 小时前
指针的算术运算详解
java·数据结构·算法
sunshine22 girl4 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习