重构手法——函数行为重塑类 | 语意 | 用工厂方法替换构造函数

46 阅读1分钟

简介

"用工厂方法替换构造函数"(Replace Constructor with Factory Method)重构手法用于解耦对象创建与类型实现。当需要根据上下文返回不同子类实例时,应该用工厂方法替代直接的对象构造。

典型代码坏味道

  • 构造函数包含类型判断逻辑
  • 需要返回不同继承体系的实例
  • 存在复杂的对象组装过程
  • 客户端直接依赖具体实现类

重构步骤

  1. 创建抽象工厂

    • 定义工厂接口或抽象类
    • 将构造函数改为protected
    • 实现具体工厂子类
  2. 迁移创建逻辑

    • 将对象构造代码移至工厂
    • 处理多态对象创建
    • 保持统一的创建接口
  3. 调整客户端

    • 替换所有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();
    }
}

专项练习

基础练习

  1. 重构支付方式创建
class Payment {
    public Payment(String type) {
        if ("ALIPAY".equals(type)) {
            // 支付宝初始化
        }
    }
}

进阶练习

  1. 实现跨平台UI组件工厂
class Dialog {
    public Dialog(String osType) {
        if ("Windows".equals(osType)) {
            // 创建Windows风格对话框
        }
    }
}

代码审查清单

优势验证

  • 客户端与实现类解耦度100%
  • 新增产品类型无需修改客户端
  • 支持多态对象创建

风险提示

  • 可能增加工厂类数量
  • 需要处理工厂生命周期
  • 增加调试复杂度