微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

工厂设计模式中避免 if-else、switch-case 的方法

如何解决工厂设计模式中避免 if-else、switch-case 的方法

我正在设计一个验证模块。它有 100 个错误代码(即 errcd_01、errcd_02、..、errcd_100)需要验证。在输入中,我得到一个超过 100 的特定错误代码(即 errcd_01)。 模块应对该特定错误代码执行验证。

我正在使用工厂模式。

/* Interface */
public interface validateErrCd {
   void check_errcd();
}

/* Concrete classes implementing the same interface */
public class validateErrCd_01 implements validateErrCd {

   @Override
   public void check_errcd() {
      //business logic related to errcd_01
   }
}

public class validateErrCd_02 implements validateErrCd {

   @Override
   public void check_errcd() {
      //business logic related to errcd_02
   }
}
.
.
.
public class validateErrCd_100 implements validateErrCd {

   @Override
   public void check_errcd() {
      //business logic related to errcd_100
   }
}

/* Factory */
public class ErrorValidationFactory {
    
   //use check_errcd method to get object of type shape 
   public validateErrCd getValidation(String errorCode){
      if(errorCode == null){
         return null;
      }     
      if(errorCode.equalsIgnoreCase("errcd_01")){
         return new validateErrCd_01();
         
      } else if(errorCode.equalsIgnoreCase("errcd_02")){
         return new validateErrCd_02();
         
      } ..
       .......
      else if(errorCode.equalsIgnoreCase("errcd_100")){
         return new validateErrCd_100();
      }
      else {
           return null;
      }
   }
}

/* I am using the Factory to get object of concrete class by passing an specific error code to be validated (i.e. "errcd_01"). */
public class FactoryPatternDemo {

   public static void main(String[] args) {
      ErrorValidationFactory errorFactory = new ErrorValidationFactory();

      //get an object of validateErrCd_01 and call its check_errcd method.
      validateErrCd errcd01 = errorFactory.getValidation("errcd_01");

      //call check_errcd method of validateErrCd_01
      errcd01.check_errcd();
   }
} 

现在由于 Factory 类 ErrorValidationFactory 中有多个 if/else,我在执行 mvn 全新安装时遇到了几个 CI/CD 错误。 例如[MethodLength] - checkstyle,规则:CyclomaticComplexity - PMD。

那么,有没有一种方法可以替代 if/else 和 switch case 的工厂内部决策,而不会在 Java 中触发上述 CI/CD 错误

注意:如果可能,我想避免反射

解决方法

您可以使用 Map

public class ErrorValidationFactory {
    private Map<String,Supplier<validateErrCd>> creators=new HashMap<>();
    public ErrorValidationFactory(){
        creators.put("errcd_100",validateErrCd_100::new);
        //Same for others
    }
   //use check_errcd method to get object of type shape 
   public validateErrCd getValidation(String errorCode){
        if(errorCode == null){
           return null;
        }
        return creators.getOrDefault(errorCode,()->null);
   }
}

Supplier 是一个函数式接口,它包含一个返回对象的方法。 SomeClass::new()->new SomeClass() 表示将使用该类的构造函数。

这允许稍后创建实例。

如果您只想创建 Map 一次,可以将其设为 static 并将其填充到静态初始化程序中。

但是,如果您真的想动态获取构造函数,则需要使用反射。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。