设计模式-工厂方法模式

工厂方法模式(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对象。

相关推荐
syt_10132 小时前
设计模式之-命令模式
设计模式·命令模式
篱笆院的狗2 小时前
Java 中线程之间如何进行通信?
java·开发语言
葱白有滋味2 小时前
Session、Token 和 JWT 的区别对比
java
Thomas_YXQ2 小时前
Unity3D的委托和事件的用法详解
java·开发语言
zwxu_2 小时前
thread堆栈分析报告
java·微服务·消息队列·熔断
百***78752 小时前
gpt-image-1.5极速接入指南:3步上手+图像核心能力解析+避坑手册
android·java·gpt
阿蒙Amon2 小时前
C#每日面试题-值类型与引用类型区别
java·面试·c#
nnsix2 小时前
Unity SenseGlove力反馈手套 基础配置
java·unity·游戏引擎
用户9446814013502 小时前
JUC 小试牛刀:从源码分析「ArrayBlockingQueue」,Java自带的线程安全的、有界的阻塞队列
java·后端