根据输入选择复用已实例化处理器子类的适用设计模式
适配方案:策略模式+注册表路由
你当前用Map维护映射的思路本身没有问题,只是缺少标准化的契约封装,这个场景最成熟的落地方案是策略模式搭配统一注册表实现,完全满足复用实例、高可扩展的要求,比硬编码映射、if-else判断的可维护性高很多。
为什么之前的方案不合适
- 抽象工厂模式核心职责是对象创建,你的诉求是对已初始化完成的实例做路由分发,场景不匹配,确实不适用。
- 裸维护Map的问题不在于思路错误,而是缺少统一的注册、路由契约,映射关系硬编码分散在业务代码里,新增处理器时需要手动修改映射逻辑,才会显得像临时补丁。
标准实现步骤
- 给
Processor接口下沉匹配能力
把“判断当前处理器是否支持处理该输入”的逻辑交给处理器自身实现,避免路由中心堆积大量分支判断:
public interface Processor { /** * 判断当前处理器是否支持处理传入的输入 */ boolean supports(InputParam input); /** * 实际业务处理逻辑 */ ProcessResult process(InputParam input); }
举个实现类的例子:
public class SimpleProcessor implements Processor { @Override public boolean supports(InputParam input) { // 写自己的匹配规则,比如根据输入类型、输入内的业务字段判断 return input.getBizType().equals(BizType.SIMPLE); } @Override public ProcessResult process(InputParam input) { // 具体处理逻辑 return null; } }
- 实现统一的处理器注册表
做单例的路由中心,统一管理所有已初始化的处理器实例,对外提供统一的路由方法。如果项目用了Spring等IoC容器,容器会自动完成处理器实例的初始化、注入,完全不需要手动创建对象:
@Component public class ProcessorRegistry { // 持有所有已初始化完成的处理器实例,全程复用,不会重复创建 private final List<Processor> processorList; // 构造器自动注入所有Processor接口的实现类实例 public ProcessorRegistry(List<Processor> processorList) { this.processorList = processorList; } /** * 根据输入路由到匹配的处理器 */ public Processor route(InputParam input) { return processorList.stream() .filter(processor -> processor.supports(input)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("未找到适配当前输入的处理器")); } }
- 业务侧调用
业务流程里不需要关心处理器的选择逻辑,直接通过注册表拿实例执行即可:
// 接收输入 InputParam input = buildInput(request); // 路由到对应处理器 Processor processor = processorRegistry.route(input); // 执行处理 ProcessResult result = processor.process(input);
方案优势
- 无重复对象创建:所有处理器都是提前初始化好的复用实例,路由过程仅做实例引用匹配,不会生成新对象。
- 完全符合开闭原则:新增处理器时,只需要新增
Processor接口的实现类,写好自身的匹配规则和处理逻辑,不需要修改路由中心、业务流程的任何现有代码,会被自动注册到路由表中。 - 逻辑边界清晰:匹配逻辑归各处理器自身维护,路由逻辑统一收口,没有散落在各处的硬编码分支。
场景适配变种
如果你的路由规则是固定的精确匹配(比如根据输入里固定的type字符串、枚举值路由),可以把注册表内部的存储结构从List换成Map<RouteKey, Processor>,每个处理器返回自己绑定的路由键,注册时直接写入Map,路由时通过键直接查询,性能比遍历匹配更高,本质逻辑和上述方案一致。
如果需要支持同个输入触发多个处理器执行,只需要给Processor接口增加优先级排序方法,路由时返回所有匹配的处理器按优先级排序后的列表即可,改造成本极低。
内容的提问来源于stack exchange,提问作者Mooncrater
相关产品推荐
相关产品推荐

