用数据结构替代硬编码分支是提升初始化工厂可扩展性的关键:通过Map注册表实现类型到行为的可配映射,用List+条件筛选支持运行时动态选择,以枚举封装元信息确保类型安全,并配合无状态对象与依赖注入使结构真正生效。

用数据结构替代硬编码分支,是让初始化工厂真正可扩展的关键一步。核心不是写更多类,而是把“类型到行为”的映射关系从代码里抽出来,变成可查、可配、可动态更新的结构。
用 Map 做注册表,把 if-else 换成查表
原始工厂里一堆 if ("json".equals(type)) return new JsonLoader(),本质是手动维护一个映射关系。换成 Map<string supplier>></string>,启动时一次性注册好:
- 扫描所有带
@Supports("yaml")注解的实现类,自动放入 map - 或通过配置文件(如 YAML)加载 key-value 对:
xml: com.example.XmlInitializer - 工厂方法只剩一行:
return registry.getOrDefault(type, fallback).get()
用 List + 条件筛选代替 switch,支持运行时组合
当初始化逻辑需要按优先级、上下文条件或权重动态选择时,Map 查表不够灵活。改用 List<initializercandidate></initializercandidate>,每个候选者自带 supports(Context ctx) 方法:
- 业务传入当前环境(如用户角色、数据来源、是否离线)
- 遍历列表,调用
candidate.supports(ctx)找出匹配项 - 可叠加多个条件,甚至支持 fallback 链(类似责任链)
用枚举 + 实例字段封装元信息,避免字符串散落
别让 "csv"、"json" 这类字面量满天飞。定义枚举 InitType,每个实例持有自己的初始化器、默认超时、是否支持异步等属性:
CSV(() -> new CsvInitializer(), 3000, true)- 工厂方法接收
InitType type,直接调type.getInitializer().init() - 类型安全、IDE 可导航、新增格式只需加一个枚举常量
配合无状态对象与依赖注入,让数据结构真正起作用
再好的数据结构,如果初始化器本身有状态或强依赖外部资源,就无法复用。确保:
- 所有初始化器是无状态的(stateless),实例可全局共享
- 需要的依赖(如数据库连接池、HTTP 客户端)通过构造器注入,不自己 new
- 注册表本身由容器管理(如 Spring 的
@PostConstruct初始化),不在业务层手动 new 工厂

















