简介
"用工厂方法替换构造函数"(Replace Constructor with Factory Method)重构手法用于解耦对象创建与类型实现。当需要根据上下文返回不同子类实例时,应该用工厂方法替代直接的对象构造。
典型代码坏味道
- 构造函数包含类型判断逻辑
- 需要返回不同继承体系的实例
- 存在复杂的对象组装过程
- 客户端直接依赖具体实现类
重构步骤
-
创建抽象工厂
- 定义工厂接口或抽象类
- 将构造函数改为protected
- 实现具体工厂子类
-
迁移创建逻辑
- 将对象构造代码移至工厂
- 处理多态对象创建
- 保持统一的创建接口
-
调整客户端
- 替换所有new操作为工厂调用
- 通过依赖注入工厂实例
- 更新单元测试用例
示例
重构前:
class Employee {
public Employee(int type) {
if (type == ENGINEER) {
// 初始化工程师
} else if (type == MANAGER) {
// 初始化经理
}
}
}
重构后:
abstract class EmployeeFactory {
public abstract Employee create();
}
class EngineerFactory extends EmployeeFactory {
public Employee create() {
return new Engineer();
}
}
class ManagerFactory extends EmployeeFactory {
public Employee create() {
return new Manager();
}
}
专项练习
基础练习
- 重构支付方式创建
class Payment {
public Payment(String type) {
if ("ALIPAY".equals(type)) {
// 支付宝初始化
}
}
}
进阶练习
- 实现跨平台UI组件工厂
class Dialog {
public Dialog(String osType) {
if ("Windows".equals(osType)) {
// 创建Windows风格对话框
}
}
}
代码审查清单
优势验证
- 客户端与实现类解耦度100%
- 新增产品类型无需修改客户端
- 支持多态对象创建
风险提示
- 可能增加工厂类数量
- 需要处理工厂生命周期
- 增加调试复杂度