面向对象语言的一个强大的特性是多态,它可以用来在代码中移除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