工厂模式之消除switch/case语句


我们在平时的编码中,我们经常会遇到这样的情况:
使用过多的switch/case 或者 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;
        }

或相应的switch case代码。

下面我提供几种方式消除这些讨厌的switch/case,if/else语句:


1,反射

利用反射创建对象:

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


缺点:需要根据类的全名进行返回对象。


2,Map


提前将对象根据相应的key-object放入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);
        }


3,Enum


根据不同的枚举类型值调用newInstance创建出不同的对象。

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();
}


转载于:https://my.oschina.net/stefanzhlg/blog/372413

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值