设计模式-工厂方法模式

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

相关推荐
撸串-研究生3 分钟前
SSM + Vue 线上作业批改系统:在线答题、文件提交与教师批改闭环90608
java·ssm·在线答题·作业批改·文件提交
一 乐8 分钟前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
wang_shu_mo_ran11 分钟前
Spring MVC 常用注解和用法(二)——url,cookie,session
java·mvc
杨运交11 分钟前
[074][示例]基于Redisson的分布式锁在定时任务中的实践与异常模拟
java·后端·spring
小刘在重生~12 分钟前
Java Lock 显式锁案例|ReentrantLock 解决多线程安全问题(超详细实战)
java·笔记·面试
步行cgn18 分钟前
Spring 中完整的 Scope 选项详解
java·后端·spring
hai_android39 分钟前
Android MeasureSpec 详解
android·java·kotlin
阳光宅男@李光熠2 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库
张宜强2 小时前
025 安居租赁 · 房屋租赁平台
java·课程设计
Java_2017_csdn2 小时前
ReentrantLock 与 Redis RLock 对比解读
java