Skip to content

工厂方法模式

字数: 0 字 时长: 0 分钟

简介

工厂方法模式(Factory Method Pattern)的核心思想是:定义一个创建对象的接口,但让实现类决定实例化哪个类

优点

  • 解耦了对象的创建和使用:调用方不关系对象创建的实现细节,只负责使用
  • 符合开闭原则,易于扩展:需要新增一个产品时,只需要新增一个工厂实现类,无需修改其他代码

缺点

  • 类的数量会增多:没新增一个产品就要新增一个对应的工厂类,随着产品增多,项目结构可能变得臃肿
  • 增加了系统复杂度:如果产品结构简单,有过度设计的嫌疑,增加了系统复杂度

UML 类图

factoryMethod.webp

  • 抽象产品(Product):定义产品的公共接口,是所有具体产品的父类
  • 具体产品(ConcreteProduct):实现了抽象产品接口
  • 抽象工厂(Creator):定义了一个返回产品对象的方法(通常是抽象方法)
  • 具体工厂(ConcreteCreator):实现了抽象工厂接口,返回具体产品对象

实现示例

标准接口形式 (最完整实现)

java
// 抽象产品
interface Document {
    void open()
}

// 具体产品 - pdf
class PdfDocument implements Document {
    public void open() {
        System.out.println("打开 pdf");
    }
}

// 具体产品 - word
class WordDocument implements Document {
    public void open() {
        System.out.println("打开 word");
    }
}

// 抽象工厂
interface DocumentFactory {
    Document createDocument();
}

// 具体工厂 - pdf
class PdfDocumentFactory implements DocumentFactory {
    public Document createDocument() {
        return new PdfDocument();
    }
}

// 具体工厂 - word
class WordDocumentFactory implements DocumentFactory {
    public Document createDocument() {
        return new WordDocument();
    }
}

// 调用
public static void main(String[] args) {
    DocumentFactory factory = new PdfDocumentFactory();
    Document document = factory.createDocument();
    document.open();
}

抽象类实现

这种实现将抽象工厂由接口改为抽象类,抽象工厂中可以定义各具体工厂都可以使用的公共逻辑。

java
// 抽象工厂
abstract class Applcation {
    // 抽象工厂方法
    public abstract Document createDocument();

    public void newDocument() {
        Document doc = createDocument();
        doc.open();
    }
}

// 具体工厂
class PdfApplication extends Applcation {
    // 实现工厂方法
    public Document createDocument() {
        return new PdfDocument();
    }
}

Spring 工厂方法模式应用

Spring 框架是工厂方法模式的集大成者,如类图所示,Spring 采用三级工厂体系,核心组件 BeanFactory 本身就是该模式的顶级接口

  • XmlWebApplicationContext 为其中一个具体工厂实现,表示基于传统 Spring XML 实现
  • AnnotationConfigApplicationContext 为另一个具体工厂实现,表示基于注解驱动

SpringFM.webp

为什么 Spring 采用工厂方法模式来实现 BeanFactory ?

  1. 支持多种创建方式:传统 XML 配置、注解扫描等
  2. 环境适配能力:通过 @Profile 条件创建不同环境的 Bean
  3. 依赖注入支持:依赖注入等功能封装在工厂接口中,业务代码仅需通过 getBean() 获取对象,无需关注实例化细节
  4. AOP支持:工厂方法模式允许运行时根据条件生成不同的子类对象,比如返回代理对象增强 AOP 功能
  5. 统一生命周期管理:Spring 通过工厂方法在对象创建前后插入钩子逻辑,集中管理 Bean 的全生命周期