设计模式-工厂方法模式

工厂方法模式(Factory Method Pattern)是一种创建型设计模式。它在简单工厂模式的基础上进行了扩展,将对象的创建逻辑进一步抽象化,使得代码更具灵活性、可维护性和可扩展性。

该模式旨在将对象的创建和使用分离,通过引入抽象工厂和具体工厂,使得系统在创建对象时更具灵活性和可扩展性。它是对简单工厂模式的进一步抽象和扩展,解决了简单工厂模式在产品种类增加时,工厂类逻辑过于复杂的问题。

1. 核心概念

  • 抽象产品(Abstract Product):定义了产品的公共接口,所有具体产品都必须实现这个接口。这保证了客户端代码可以统一地使用不同具体产品,而无需关心其具体实现。
  • 具体产品(Concrete Product):实现了抽象产品接口,是实际创建和使用的对象。每个具体产品都有其独特的实现细节。
  • 抽象工厂(Abstract Factory):声明了创建抽象产品的抽象方法。它不负责具体产品的创建,而是由其具体子类来实现创建逻辑。这种抽象化使得系统易于扩展新的产品类型。
  • 具体工厂(Concrete Factory):继承自抽象工厂,实现了创建具体产品的方法。每个具体工厂负责创建一种或多种相关的具体产品。

2. 工作原理

客户端不直接实例化具体产品,而是调用抽象工厂的抽象创建方法。根据客户端使用的具体工厂子类不同,该抽象方法会返回不同的具体产品实例。这样,客户端代码与具体产品的创建过程解耦,只依赖于抽象产品和抽象工厂,使得系统更易于维护和扩展。

3. 示例代码

以生产不同类型交通工具为例:

java 复制代码
// 抽象产品:交通工具
interface Vehicle {
    void drive();
}

// 具体产品:汽车
class Car implements Vehicle {
    @Override
    public void drive() {
        System.out.println("驾驶汽车");
    }
}

// 具体产品:自行车
class Bike implements Vehicle {
    @Override
    public void drive() {
        System.out.println("骑行自行车");
    }
}

// 抽象工厂
abstract class VehicleFactory {
    public abstract Vehicle createVehicle();
}

// 具体工厂:汽车工厂
class CarFactory extends VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Car();
    }
}

// 具体工厂:自行车工厂
class BikeFactory extends VehicleFactory {
    @Override
    public Vehicle createVehicle() {
        return new Bike();
    }
}

// 客户端代码
public class FactoryMethodPatternExample {
    public static void main(String[] args) {
        // 使用汽车工厂创建汽车
        VehicleFactory carFactory = new CarFactory();
        Vehicle car = carFactory.createVehicle();
        car.drive();

        //使用自行车工厂创建自行车
        VehicleFactory bikeFactory = new BikeFactory();
        Vehicle bike = bikeFactory.createVehicle();
        bike.drive();
    }
}

4. 优点

  • 可维护性 :当需要增加新的产品类型时,只需创建新的具体产品类和对应的具体工厂类,无需修改现有客户端代码。例如,如果要增加"飞机"作为新的交通工具,只需创建Airplane类实现Vehicle接口,以及AirplaneFactory类继承VehicleFactory并实现createVehicle方法即可。
  • 可扩展性:易于引入新的具体工厂和产品,符合开闭原则(对扩展开放,对修改关闭)。系统可以方便地应对业务需求的变化,例如不同季节生产不同类型交通工具,通过创建不同的具体工厂来实现。
  • 解耦创建和使用:客户端只关心抽象产品和抽象工厂,不涉及具体产品的创建细节,降低了客户端与具体产品之间的耦合度。

5. 缺点

  • 工厂类数量增多:随着产品类型的增加,具体工厂类的数量也会相应增多,可能导致代码复杂度略有上升。例如,当有多种不同品牌或类型的交通工具时,会有较多的具体工厂类。
  • 抽象工厂接口的修改影响大:如果抽象工厂接口发生变化,例如增加或修改创建方法,所有具体工厂类都需要相应修改,这在一定程度上违背了开闭原则。不过,这种情况相对较少发生,且在设计良好的系统中可以通过合理的抽象来避免。

工厂方法模式适用于对象创建过程复杂,或者需要根据不同条件创建不同类型对象的场景。在许多框架和库中都广泛应用了这一模式,例如在Spring框架中,BeanFactory就是工厂方法模式的一种应用,用于创建各种Bean对象。

相关推荐
蜗牛互联网21 分钟前
Java标准HTTP调用多模态模型的票据抽取前置校验
java·人工智能·python·http
工具派37 分钟前
Agent 不是玄学:用 Java 状态机思维理解 LangGraph
java·人工智能·python
十年Java程序媛1 小时前
String / StringBuilder / StringBuffer|别再乱用字符串拼接,底层原理一次讲透
java·spring boot·后端
傲世仙尊1 小时前
类和对象中-构造函数与析构函数把初始化清理自动化
java·运维·自动化
她的男孩1 小时前
权限通了、列表有数,一点分页就炸Forge Admin 用 COUNT(1) 扛住复杂待办
java·spring boot·mybatis
骑着蜗牛撵大象3271 小时前
豆包 Seed 驱动的记账智能体:从拍票抽取到月报生成的全链路落地记录
java·前端·javascript·结构化输出·豆包seed·多模态识别·记账系统
憧憬成为java架构高手的小白1 小时前
langchain4j手敲理解
java·langchain
10mAh2 小时前
【Java】ArrayList 遍历删除为什么报错?三种写法与漏删复现
java·开发语言·windows
thefool1122662 小时前
多线程 4
java
Rain的Java大神之路2 小时前
[特殊字符]8年Java老兵转型AI Agent:90%的人挂在同一个坑,根本不用学Python!(万字实战复盘,建议收藏)
java·数据库·人工智能·后端·python·spring·ai编程