工厂方法模式

工厂方法模式:解耦与灵活性的经典设计模式

工厂方法模式(Factory Method Pattern)是设计模式中最经典、最常用的创建型模式之一。它通过定义一个创建对象的接口,但由子类决定实例化哪个类,从而将对象的创建过程与使用过程解耦。本文将从工厂方法模式的好处、经典实现以及具体应用场景出发,全面总结这一设计模式的核心价值。


一、工厂方法模式的好处

1. 解耦对象的创建与使用

工厂方法模式将对象的创建过程封装在工厂类中,客户端代码只需要通过工厂接口获取对象,而无需关心对象的具体实现。这种设计使得客户端代码与具体对象的实现类解耦,降低了代码的耦合度。

2. 符合开闭原则

当需要新增产品类时,只需要扩展工厂类(新增具体工厂),而无需修改现有代码。这种设计符合开闭原则(对扩展开放,对修改关闭),提高了代码的可维护性和可扩展性。

3. 提高代码的可读性和可维护性

对象的创建逻辑集中在工厂类中,客户端代码更加简洁,易于理解和维护。工厂类的职责单一,符合单一职责原则。

4. 支持多态

工厂方法模式通过接口或抽象类定义工厂,具体工厂可以返回不同的产品对象,支持多态性。

5. 便于单元测试

工厂方法模式可以方便地使用 Mock 对象进行单元测试,因为客户端代码依赖于工厂接口,而不是具体实现类。


二、工厂方法模式的经典实现

以下是一个经典的工厂方法模式实现示例:

1. 定义产品接口
java 复制代码
public interface Product {
    void use();
}
2. 定义具体产品类
java 复制代码
public class ProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using Product A");
    }
}

public class ProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using Product B");
    }
}
3. 定义工厂接口
java 复制代码
public interface Factory {
    Product createProduct();
}
4. 定义具体工厂类
java 复制代码
public class FactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

public class FactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }
}
5. 客户端代码
java 复制代码
public class Client {
    public static void main(String[] args) {
        Factory factory = new FactoryA(); // 使用 FactoryA 创建 ProductA
        Product product = factory.createProduct();
        product.use();

        factory = new FactoryB(); // 使用 FactoryB 创建 ProductB
        product = factory.createProduct();
        product.use();
    }
}

三、工厂方法模式的具体应用场景

1. MyBatis 中的 SqlSessionFactory

在 MyBatis 中,SqlSessionFactory 是工厂接口,负责创建 SqlSession 对象。具体的工厂实现类(如 DefaultSqlSessionFactory )封装了 SqlSession 的创建逻辑,客户端代码只需要通过 SqlSessionFactory 获取 SqlSession,而无需关心其具体实现。

java 复制代码
SqlSessionFactory factory = new DefaultSqlSessionFactory();
SqlSession session = factory.openSession();
2. Spring Boot 中的 @Bean

在 Spring Boot 中,@Bean 注解用于定义一个工厂方法,Spring 容器会调用该方法创建 Bean。通过工厂方法模式,Spring Boot 将对象的创建过程解耦,支持动态配置和扩展。

java 复制代码
@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}
3. Spring MVC 中的 ViewResolver

在 Spring MVC 中,ViewResolver 是工厂接口,负责创建 View 对象。具体的工厂实现类(如 InternalResourceViewResolver )封装了 View 的创建逻辑,客户端代码只需要通过 ViewResolver 获取 View,而无需关心其具体实现。

java 复制代码
ViewResolver resolver = new InternalResourceViewResolver();
View view = resolver.resolveViewName("home", Locale.getDefault());

四、工厂方法模式的解耦体现

  1. 客户端代码与具体产品类解耦

    • 客户端代码只依赖 Factory 接口和 Product 接口,不需要知道 ProductAProductB 的具体实现。
  2. 动态切换产品

    • 通过更换具体工厂类(如从 FactoryA 切换到 FactoryB),可以动态切换产品的实现,而无需修改客户端代码。
  3. 扩展方便

    • 如果需要新增产品(如 ProductC ),只需要新增一个具体工厂类(如 FactoryC),而无需修改现有代码。

五、总结

工厂方法模式通过将对象的创建过程封装在工厂类中,实现了客户端代码与具体对象的解耦。它的主要好处包括:

  • 符合开闭原则,便于扩展。
  • 提高代码的可读性和可维护性。
  • 支持多态和动态切换产品。

MyBatisSpring BootSpring MVC 等框架中,工厂方法模式被广泛应用,用于解耦对象的创建与使用,增强系统的灵活性和可维护性。通过工厂方法模式,可以更好地组织代码,降低耦合度,提高系统的灵活性和可维护性。

相关推荐
颜淡慕潇2 分钟前
Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
java·redis·分布式
程序员秘密基地8 分钟前
基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql数据库,在线考试系统
java·vue.js·spring boot·spring·web app
何中应9 分钟前
【设计模式-5】设计模式的总结
java·后端·设计模式
草莓熊Lotso10 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
海的诗篇_26 分钟前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
吾日三省吾码27 分钟前
Spring 团队详解:AOT 缓存实践、JSpecify 空指针安全与支持策略升级
java·spring·缓存
风象南1 小时前
SpringBoot的5种日志输出规范策略
java·spring boot·后端
cccc来财1 小时前
Go中的协程并发和并发panic处理
开发语言·后端·golang
咖啡啡不加糖1 小时前
深入理解MySQL死锁:从原理、案例到解决方案
java·数据库·mysql
zimoyin1 小时前
Compose Multiplatform 实现自定义的系统托盘,解决托盘乱码问题
java