1. 工厂方法模式
一、是什么
工厂方法模式属于创建型设计模式的一种,提供了创建对象的接口。本质就是我们不关心生产对象的过程,我们只关心生成出什么样的对象。
二、作用是什么
- 降低了代码的耦合度
- 提高可扩展性,符合开闭原则
- 业务逻辑和构建逻辑解耦
- 面向接口编程
三、能够解决什么问题
- 大量 if/else 或 switch 的构造代码:新增产品必须修改原有的业务代码,会破坏开闭原则,导致代码不可维护(工厂方法就是通过多态来替换if-else、switch)
- 构造逻辑复杂且多变:比如参数的校验,构造依赖注入,资源装载。工厂方法模式就是把复杂构造逻辑从业务里抽出去,让每个对象有独立、可维护的创建入口。
- 隔离产品差异,确保扩展稳定。不同产品(对象)差异巨大,但业务层不应该感知差异,而应该只依赖抽象接口。
真实项目中构造逻辑很复杂,产品差异很大,如果不把构造封装在各自的工厂里,业务层会变成垃圾代码且高度耦合,系统无法迭代。
工厂方法的根本价值,是将高度差异化、复杂多变的构造过程从业务中剥离,确保业务只依赖抽象能力,使系统具备可维护、可扩展和可演进性。
四、适用的场景
| 场景 | 为什么适合 |
|---|---|
| 支付体系(微信、支付宝、银行卡…) | 持续新增渠道、统一抽象支付行为 |
| 通知系统(短信、邮件、站内信…) | 渠道差异大但行为统一 |
| 文件解析(XML/JSON/YAML/CSV) | 针对格式扩展新的解析器 |
| 策略模块(风控策略、优惠策略) | 策略解耦、可动态切换 |
| 产品工单处理流程 | 不同类型工单有不同处理器 |
五、特点
-
抽象产品(Product)
定义产品行为接口。 -
具体产品(Concrete Product)
实现产品的业务能力。 -
抽象工厂(Creator)
声明工厂方法(createProduct)。 -
具体工厂(Concrete Creator)
负责实际创建产品,封装构建细节。
六、编码实现
此处我以造车为例,车厂品牌有宝马和小米。
public interface CarFactory {Car createCar();
}
public class XiaomiCarFactory implements CarFactory {@Overridepublic Car createCar() {return new XiaomiCar();}
}
public class BMWFactory implements CarFactory {@Overridepublic Car createCar() {return new BMWCar();}
}public interface Car {String getCar();
}public class XiaomiCar implements Car{@Overridepublic String getCar() {return "小米汽车";}
}public class BMWCar implements Car{@Overridepublic String getCar() {return "BMW";}
}public class demo {public static void main(String[] args) {CarFactory bmwCar = new BMWFactory();Car bmw = bmwCar.createCar();CarFactory xaiomiCar = new XiaomiCarFactory();Car xaiomi = xaiomiCar.createCar();System.out.println(bmw.getCar());System.out.println(xaiomi.getCar());}
}
七、分析框架源码
- Spring 的 BeanFactory = 抽象工厂角色
负责:
Bean 的定义加载
Bean 的统一管理
延迟实例化
- FactoryBean = 工厂方法模式的“衍生强化版”
FactoryBean 本质上是让 Bean 自己成为工厂,由框架托管。
典型处理逻辑:
用户调用 getBean(beanName) ↓ Spring 检测该 bean 是否实现 FactoryBean ↓ 是 → 使用
FactoryBean.getObject() 创建产品对象 否 → 使用默认实例化逻辑创建 bean这正体现“抽象工厂定义规则,具体工厂决定实例化细节”。
框架使用工厂方法的根本原因 让对象的创建从“代码逻辑”变成“可配置、可拓展、可替换”的平台能力。
