工厂方法模式
字数: 0 字 时长: 0 分钟
简介
工厂方法模式(Factory Method Pattern)的核心思想是:定义一个创建对象的接口,但让实现类决定实例化哪个类。
优点:
- 解耦了对象的创建和使用:调用方不关系对象创建的实现细节,只负责使用
- 符合开闭原则,易于扩展:需要新增一个产品时,只需要新增一个工厂实现类,无需修改其他代码
缺点:
- 类的数量会增多:没新增一个产品就要新增一个对应的工厂类,随着产品增多,项目结构可能变得臃肿
- 增加了系统复杂度:如果产品结构简单,有过度设计的嫌疑,增加了系统复杂度
UML 类图
- 抽象产品(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
为另一个具体工厂实现,表示基于注解驱动
为什么 Spring 采用工厂方法模式来实现 BeanFactory ?
- 支持多种创建方式:传统 XML 配置、注解扫描等
- 环境适配能力:通过
@Profile
条件创建不同环境的 Bean - 依赖注入支持:依赖注入等功能封装在工厂接口中,业务代码仅需通过
getBean()
获取对象,无需关注实例化细节 - AOP支持:工厂方法模式允许运行时根据条件生成不同的子类对象,比如返回代理对象增强 AOP 功能
- 统一生命周期管理:Spring 通过工厂方法在对象创建前后插入钩子逻辑,集中管理 Bean 的全生命周期