analysis-task-3.md 5.3 KB

任务 3: 工厂模式和策略模式分析

CleanFactory 核心实现分析

核心组件

  1. 策略缓存映射

    • DATA_CLEANER_MAP:策略类型 → 数据清洗器创建器映射
    • DATA_LOADER_MAP:策略类型 → 数据加载器创建器映射
    • 使用 HashMap 存储,支持快速查找
  2. 创建器类型

    • 使用 Supplier<DataCleaner<?, ?>> 作为清洗器创建器
    • 使用 Supplier<DataLoader<?, ?>> 作为加载器创建器
    • Supplier 函数式接口:无参构造新实例

静态注册机制

执行流程:

  1. 静态代码块:在类加载时执行
  2. 策略注册:为每种策略类型绑定对应的创建器
  3. Lambda 表达式:使用方法引用 ::new 创建 Supplier 实例
  4. 策略类型映射:将策略类型与创建器一一对应

已注册的策略类型:

  1. 数据清洗器策略:

    • CALL_DATA → CallDataCleaner
    • TRANS_STD → TransStdDataCleaner
    • CALL_OPEN_INFO → CallOpenInfoDataCleaner
    • TRANS_OPEN → TransOpenDataCleaner
    • TRANS_IN_OUT → TransInOutDataCleaner
    • 以及其他多种数据类型的清洗器
  2. 数据加载器策略:

    • CALL_DATA → CallStdDataLoader
    • TRANS_STD → TransStdDataLoader
    • CALL_OPEN_INFO → CallOpenInfoDataLoader
    • TRANS_OPEN → TransOpenDataLoader
    • TRANS_IN_OUT → TransInOutDataLoader
    • 以及其他多种数据类型的加载器

核心方法分析

1. createDataCleaner(StrategyType strategyType, String funcRegx, FileInfo currentSheet)

执行流程:

  1. 获取创建器:从 DATA_CLEANER_MAP 中获取对应策略的创建器
  2. 参数验证:检查创建器是否存在,不存在则抛出异常
  3. 创建实例:调用 supplier.get() 创建清洗器实例
  4. 初始化实例:调用 cleaner.init(funcRegx, currentSheet) 进行初始化
  5. 类型转换:将通用类型转换为泛型类型并返回

2. createDataLoader(StrategyType strategyType)

执行流程:

  1. 获取创建器:从 DATA_LOADER_MAP 中获取对应策略的创建器
  2. 参数验证:检查创建器是否存在,不存在则抛出异常
  3. 创建实例:调用 supplier.get() 创建加载器实例
  4. 类型转换:将通用类型转换为泛型类型并返回

3. 扩展方法

  • registerDataCleaner(StrategyType strategyType, Supplier<DataCleaner<?, ?>> supplier):动态注册清洗器策略
  • registerDataLoader(StrategyType strategyType, Supplier<DataLoader<?, ?>> supplier):动态注册加载器策略

设计模式分析

  1. 工厂模式

    • 核心思想:将对象创建与使用分离
    • 实现方式:通过 CleanFactory 统一创建清洗器和加载器实例
    • 优势:
      • 集中管理对象创建逻辑
      • 隐藏具体实现细节
      • 便于维护和扩展
  2. 策略模式

    • 核心思想:定义一系列算法,封装每个算法,并使它们可以互换
    • 实现方式:
      • 定义 DataCleaner 和 DataLoader 接口
      • 为每种数据类型实现具体策略
      • 通过 StrategyType 动态选择策略
    • 优势:
      • 算法与使用分离
      • 支持运行时动态切换策略
      • 便于添加新策略
  3. 懒加载模式

    • 核心思想:延迟创建对象,直到真正需要时
    • 实现方式:在 StreamingEtlListener 中按需创建清洗器和加载器
    • 优势:
      • 节省内存资源
      • 提高启动速度

关键设计特点

  1. 类型安全:使用泛型确保类型安全
  2. 自动初始化:创建实例后自动调用初始化方法
  3. 动态注册:支持运行时动态注册新策略
  4. 错误处理:提供详细的错误信息,便于问题排查
  5. 可扩展性:模块化设计,便于添加新的数据类型和处理策略

策略选择流程

[模板ID] → [StrategyType.fromCode(mainId)] → [CleanFactory.createDataCleaner()/createDataLoader()]
                                              ↓
[从缓存获取创建器] → [创建实例] → [初始化] → [返回实例]

代码优化建议

  1. 策略管理增强:

    • 考虑添加策略配置文件,支持外部配置
    • 实现策略的动态加载和卸载
  2. 错误处理增强:

    • 添加更详细的错误信息和异常处理
    • 实现策略创建的重试机制
  3. 性能优化:

    • 考虑使用缓存池管理清洗器和加载器实例
    • 优化策略查找和创建过程
  4. 监控增强:

    • 添加策略使用统计和监控
    • 实现策略性能分析
  5. 扩展性增强:

    • 提供策略注册的 SPI 机制
    • 支持插件式扩展新策略

应用场景分析

  1. 新增数据类型:

    • 实现新的 DataCleaner 和 DataLoader 接口
    • 在 CleanFactory 静态代码块中注册新策略
    • 无需修改现有代码,即可支持新的数据类型
  2. 策略替换:

    • 实现新的策略实现类
    • 在 CleanFactory 中更新对应的策略注册
    • 实现无缝替换,不影响现有功能
  3. 动态策略:

    • 使用 registerDataCleaner 和 registerDataLoader 方法
    • 在运行时动态注册新策略
    • 支持热插拔功能