在工厂设计模式中避免 if-else 和 switch-case 的方法
Ways to Avoid if-else, switch-case in Factory design pattern
我正在设计一个验证模块。它有 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 class ErrorValidationFactory 中有多个 if/else,我在执行 mvn clean install 时遇到了几个 CI/CD 错误。
例如[MethodLength] - checkstyle,Rule:CyclomaticComplexity - PMD。
那么有没有一种方法可以替代 if/else,工厂内部的开关案例类决策,它不会在 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()
表示将使用 class 的构造函数。
这允许稍后创建实例。
如果您只想创建 Map
一次,您可以创建它 static
并在静态初始化程序中填充它。
但是,如果你真的想动态获取构造函数,则需要使用反射。
我正在设计一个验证模块。它有 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 class ErrorValidationFactory 中有多个 if/else,我在执行 mvn clean install 时遇到了几个 CI/CD 错误。 例如[MethodLength] - checkstyle,Rule:CyclomaticComplexity - PMD。
那么有没有一种方法可以替代 if/else,工厂内部的开关案例类决策,它不会在 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()
表示将使用 class 的构造函数。
这允许稍后创建实例。
如果您只想创建 Map
一次,您可以创建它 static
并在静态初始化程序中填充它。
但是,如果你真的想动态获取构造函数,则需要使用反射。