工厂模式创建的产品类如何不实例化调用对应静态方法并避免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
相关产品推荐
相关产品推荐

