# 任务 3: 工厂模式和策略模式分析 ## CleanFactory 核心实现分析 ### 核心组件 1. **策略缓存映射** - `DATA_CLEANER_MAP`:策略类型 → 数据清洗器创建器映射 - `DATA_LOADER_MAP`:策略类型 → 数据加载器创建器映射 - 使用 `HashMap` 存储,支持快速查找 2. **创建器类型** - 使用 `Supplier>` 作为清洗器创建器 - 使用 `Supplier>` 作为加载器创建器 - 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> supplier)`:动态注册清洗器策略 - `registerDataLoader(StrategyType strategyType, Supplier> 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` 方法 - 在运行时动态注册新策略 - 支持热插拔功能