工厂类中移除if/else语句

面向对象语言的一个强大的特性是多态,它可以用来在代码中移除if/else语句或者switch-case语句块。没有条件的代码很容易阅读,但有些地方你不得不添加if/else代码块,比如工厂类。

相信你曾经看到过某个工厂类中的if/else变得越来越多。在这篇博文中,将共享几个可以在工厂类中移除if/else语句的方法:

 

会以下面的代码片段为例:

 

public static Validator newInstance(String validatorType) {
        if ("INT".equals(validatorType))
            return new IntValidator();
        else if ("DATE".equals(validatorType))
            return new DateValidator();
        else if ("LOOKUPVALUE".equals(validatorType))
            return new LookupValueValidator();
        else if ("STRINGPATTERN".equals(validatorType))
            return new StringPatternValidator();
        return null;
    }

第一种方法:使用反射(Reflection)

 

public static Validator newInstance(String validatorClass) {
    return Class.forName(validatorClass).newInstance();
}

 

这是第一个映入我脑海的方法,这看上去很简单,但是调用者必须知道完整的类名。

第二种方法:使用Map

 

Map<String, Validator> validators = new HashMap<String, Validator>() {
    {
        put("INT", new IntValidator());
        put("LOOKUPVALUE", new LookupValueValidator());
        put("DATE", new DateValidator());
        put("STRINGPATTERN", new StringPatternValidator());
    }
};
 
public Validator newInstance(String validatorType) {
    return validators.get(validatorType);
}

 

第三种方法:使用Enum

 

enum ValidatorType {
        INT {
            public Validator create() {
                return new IntValidator();
            }
        },
        LOOKUPVALUE {
            public Validator create() {
                return new LookupValueValidator();
            }
        },
        DATE {
            public Validator create() {
                return new DateValidator();
            }
        };
        public Validator create() {
            return null;
        }
    }
 
    public Validator newInstance(ValidatorType validatorType) {
        return validatorType.create();
    }

 

该方法使用枚举类的方法移除条件逻辑。个人比较喜欢这种方法。

参考 http://www.javacodegeeks.com/2014/10/factory-without-if-else.html

猜你喜欢

转载自mouselearnjava.iteye.com/blog/2310346