1. 工厂模式基础认知
工厂模式作为创建型设计模式的代表,其核心价值在于解耦对象的创建与使用。想象一下你去餐厅点餐的场景:作为顾客,你只需要告诉服务员"我要一份牛排",而不需要关心牛排是如何烹饪的、由哪位厨师制作的。工厂模式正是扮演着这个"服务员"的角色,让客户端代码无需知晓对象创建的具体细节。
在Java生态中,工厂模式的应用无处不在。从Spring框架的BeanFactory到JDK中的Collection工厂方法,再到各种开源库的对象创建逻辑,工厂模式都发挥着重要作用。它特别适合以下场景:
- 对象创建过程复杂(需要大量初始化参数或依赖)
- 需要统一管理对象的生命周期
- 系统需要支持多种相似产品的灵活切换
- 希望隐藏具体实现类,只暴露接口给客户端
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 简单工厂模式深度解析
2.1 模式结构与实现原理
简单工厂模式的核心在于一个集中化的工厂类,它根据输入参数决定创建哪种具体产品。让我们扩展计算器案例,看看更完整的实现:
java复制// 产品接口
public interface Operation {
double calculate(double a, double b);
}
// 具体产品类
public class Addition implements Operation {
@Override
public double calculate(double a, double b) {
return a + b;
}
}
public class Subtraction implements Operation {
@Override
public double calculate(double a, double b) {
return a - b;
}
}
// 工厂类
public class OperationFactory {
public static Operation createOperation(String operator) {
switch (operator) {
case "+": return new Addition();
case "-": return new Subtraction();
case "*": return new Multiplication(); // 扩展乘法
case "/": return new Division(); // 扩展除法
default: throw new IllegalArgumentException("未知运算符");
}
}
}
关键设计要点:工厂类通常使用静态方法,这样客户端可以直接通过类名调用,无需实例化工厂对象。但这也带来了难以扩展的问题。
2.2 实际应用场景分析
简单工厂模式特别适合以下场景:
- 对象创建逻辑相对简单,不会频繁变化
- 产品类型数量有限(通常不超过10个)
- 客户端只需要传入简单参数即可确定所需对象
典型案例包括:
- 日志记录器工厂(创建文件日志/控制台日志等)
- 数据库连接工厂(MySQL/Oracle等不同驱动)
- 图形界面中的主题工厂(创建不同风格的UI组件)
2.3 优缺点与适用边界
优势体现:
- 客户端与具体实现解耦,只需知道工厂类和产品接口
- 集中化管理对象创建逻辑,便于统一修改
- 减少重复创建代码,提高代码复用率
局限性:
- 违反开闭原则(对扩展开放,对修改关闭)
- 工厂类职责过重,随着产品增加会变得臃肿
- 难以支持复杂的产品创建逻辑
经验之谈:当发现工厂类的switch/case或if-else超过20行时,就应该考虑升级为工厂方法模式了。
3. 工厂方法模式进阶实践
3.1 模式演化与实现
工厂方法模式将对象的创建延迟到子类,定义了一个创建对象的接口,但让子类决定实例化哪个类。我们扩展计算器案例:
java复制// 抽象工厂
public interface OperationFactory {
Operation createOperation();
}
// 具体工厂
public class AddFactory implements OperationFactory {
@Override
public Operation createOperation() {
return new Addition();
}
}
public class SubFactory implements OperationFactory {
@Override
public Operation createOperation() {
return new Subtraction();
}
}
// 客户端使用
public class Client {
public static void main(String[] args) {
OperationFactory factory = new AddFactory();
Operation op = factory.createOperation();
double result = op.calculate(5, 3);
}
}
3.2 模式优势深度剖析
工厂方法模式的核心优势在于符合开闭原则。当需要新增运算类型时:
- 创建新的运算类实现Operation接口
- 创建对应的工厂类实现OperationFactory
- 客户端代码无需任何修改即可使用新运算
这种扩展方式完全避免了修改现有代码,大大降低了引入bug的风险。在框架设计中,这种特性尤为重要,比如Spring的BeanFactory就是典型的工厂方法模式实现。
3.3 实际项目中的应用技巧
在复杂项目中应用工厂方法模式时,有几个实用技巧:
- 工厂接口设计:工厂方法可以接收参数,实现更灵活的创建逻辑
java复制public interface Operation
