1. 工厂方法模式深度解析
工厂方法模式是我在多年软件开发实践中使用频率最高的设计模式之一。它完美体现了"面向接口编程"和"开闭原则"的思想,让代码在面对变化时展现出惊人的弹性。记得我第一次在电商支付系统中应用这个模式时,原本需要三天才能接入的新支付方式,现在只需要两小时就能完成。
1.1 模式本质与价值
工厂方法模式的核心在于将对象的创建过程抽象化。当我们需要创建一个对象,但又不能或不希望指定具体的类时,这个模式就派上用场了。它通过定义一个创建对象的接口,但让子类决定实例化哪个类,实现了创建逻辑的延迟绑定。
关键理解:工厂方法模式不是用来替代new关键字的,而是用来管理那些需要灵活创建的对象的。
在实际项目中,我发现这个模式特别适合以下场景:
- 系统需要支持多种实现变体
- 创建逻辑可能随时间变化
- 需要将产品创建与使用解耦
- 需要提供扩展点让其他开发者自定义实现
1.2 模式结构详解
让我们更深入地看看工厂方法模式的各个组成部分:
1.2.1 产品接口(Product)
这是所有具体产品的父类或接口,定义了产品的公共方法。设计时要注意:
- 接口应该足够抽象,能涵盖所有变体的共性
- 但也不能过于宽泛,否则实现类会难以遵循
- 通常包含3-5个核心方法为宜
1.2.2 具体产品(Concrete Product)
实现产品接口的具体类。每个具体产品都应该:
- 完全实现产品接口的所有方法
- 可以有自己的特有方法和属性
- 通常与具体工厂一一对应
1.2.3 创建者接口(Creator)
声明工厂方法的抽象类或接口。关键点:
- 可以只声明工厂方法,也可以提供默认实现
- 可以包含与产品相关的业务逻辑(模板方法)
- 不应该知道具体产品的细节
1.2.4 具体创建者(Concrete Creator)
实现或重写工厂方法的具体类。注意:
- 每个具体创建者通常只负责创建一个具体产品
- 可以包含产品初始化逻辑
- 可以重写父类的其他方法以改变行为
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实战:构建可扩展的日志系统
让我们通过一个更完整的日志系统示例,展示工厂方法模式的实际应用。这个系统需要支持控制台、文件和数据库三种日志方式,并且要易于扩展新的日志类型。
2.1 产品接口设计
首先定义日志记录器的抽象接口:
java复制/**
* 日志记录器接口
* 设计要点:
* 1. 包含日志记录的基本操作
* 2. 考虑线程安全性
* 3. 支持不同日志级别
*/
public interface Logger {
void debug(String message);
void info(String message);
void warn(String message);
void error(String message, Throwable t);
/**
* 是否启用某个日志级别
*/
boolean isEnabled(LogLevel level);
/**
* 设置日志级别过滤器
*/
void setFilter(LogFilter filter);
}
2.2 具体产品实现
以文件日志记录器为例,展示一个更完整的实现:
java复制public class FileLogger implements Logger {
private final Path logPath;
private LogFilter filter;
private final Lock writeLock = new ReentrantLock();
public FileLogger(Path logPath) {
this.logPath = logPath;
createLogFileIfNotExists();
}
private void createLogFileIfNotExists() {
// 文件创建逻辑...
}
@Override
public void i
