You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

根据输入选择复用已实例化处理器子类的适用设计模式

适配方案:策略模式+注册表路由

你当前用Map维护映射的思路本身没有问题,只是缺少标准化的契约封装,这个场景最成熟的落地方案是策略模式搭配统一注册表实现,完全满足复用实例、高可扩展的要求,比硬编码映射、if-else判断的可维护性高很多。

为什么之前的方案不合适

  • 抽象工厂模式核心职责是对象创建,你的诉求是对已初始化完成的实例做路由分发,场景不匹配,确实不适用。
  • 裸维护Map的问题不在于思路错误,而是缺少统一的注册、路由契约,映射关系硬编码分散在业务代码里,新增处理器时需要手动修改映射逻辑,才会显得像临时补丁。

标准实现步骤

  1. 给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;
    }
}
  1. 实现统一的处理器注册表
    做单例的路由中心,统一管理所有已初始化的处理器实例,对外提供统一的路由方法。如果项目用了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("未找到适配当前输入的处理器"));
    }
}
  1. 业务侧调用
    业务流程里不需要关心处理器的选择逻辑,直接通过注册表拿实例执行即可:
// 接收输入
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:21:22