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

工厂模式创建的产品类如何不实例化调用对应静态方法并避免if-else

推荐使用Map + 静态方法引用的方案实现,完全满足你「不创建实例、不用if-else分支」的需求,Java 8及以上版本都可直接使用:

改造后的工厂类代码

import java.util.Map;
import java.util.HashMap;

public class Factory {
    // 注册所有产品类型对应的静态方法引用
    private static final Map<String, Runnable> PRODUCT_METHOD_MAPPER = new HashMap<>();
    
    static {
        PRODUCT_METHOD_MAPPER.put("Product1", Product1::doSomething);
        PRODUCT_METHOD_MAPPER.put("Product2", Product2::doSomething);
        // 后续新增产品类型仅需在这里添加一行注册代码即可,无需修改业务逻辑
    }

    // 对外提供的调用入口
    public static void invokeDoSomething(String type) {
        Runnable targetMethod = PRODUCT_METHOD_MAPPER.get(type);
        if (targetMethod == null) {
            throw new IllegalArgumentException("不支持的产品类型:" + type);
        }
        targetMethod.run();
    }

    // 原有创建产品实例的方法可保留
    public Product createProduct(String type) {
        if(type.equals("Product1")) {
            return new Product1();
        } else if(type.equals("Product2")) {
            return new Product2();
        }
        throw new IllegalArgumentException("不支持的产品类型:" + type);
    }
}

调用方式

需要调用时仅需一行代码即可完成,无需任何分支判断:

Factory.invokeDoSomething("Product1"); // 自动调用Product1的doSomething静态方法

方案优势

  • 没有冗余的if-else分支,后续新增产品类型仅需补充注册逻辑,符合开闭原则
  • 全程不会创建产品类的实例,完全符合你的要求
  • 性能远高于反射实现,代码可读性和可维护性更强

注意事项

如果你的doSomething方法需要传入参数或者有返回值,把Map的值类型从Runnable替换为对应的函数式接口即可:

  • 有单个入参无返回值:用Consumer<T>
  • 有单个入参有返回值:用Function<T,R>
  • 有两个入参有返回值:用BiFunction<T,U,R>
  • 自定义参数场景:自己定义符合参数规则的函数式接口即可

不推荐使用反射实现,反射需要处理类加载、方法查找、权限校验等大量异常逻辑,性能差的同时可维护性也很低。


内容的提问来源于stack exchange,提问作者sininen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:05