简单工厂模式使用枚举+反射替代if-else写法

    /**
     * 根据类型生成对应的User子类
     * @param type
     * @return
     */
    public static User createUser(String type) {
        if ("A".equals(type)) {
            return new AUser();
        } else if ("B".equals(type)) {
            return new BUser();
        } else if ("C".equals(type)) {
            return new CUser();
        }
    }

简单工厂模式往往使用if-else根据传参判断生成相应的实体类(例:createUser方法根据type去创建对应User子类),后期如果新增其它User子类则需扩展else if分支(例:else if ("D".equals(type)) { return new DUser(); }),违反开闭原则,容易出错,影响到已正常运行的程序。

因此我们可以使用枚举+反射来替代这种写法

枚举类

根据传参和子类的类名创建

enum UserEnum{
    AUser("A","AUser"),
    BUser("B","BUser"),
    CUser("C","CUser");
    //User类对应的type
    private String type;
    //User类的类名
    private String UserClassName;
    //类所属包路径前缀
    private static final String packageName="com.xxx.";

    private UserEnum(String type,String UserClassName){
        this.type=type;
        this.UserClassName=UserClassName;
    }

    public String getType() {
        return type;
    }

    public String getUserClassName() {
        return UserClassName;
    }

    /**
     * 根据传参获取子类完整路径名
     * @param type
     * @return
     */
    public static String getUserClassName(String type) {
        for(UserEnum user:UserEnum.values()){
            if(user.getType().equals(type)){
                return packageName+user.getUserClassName();
            }
        }
        return null;
    }
}

生成对象方法createUser更改如下

    /**
     * 根据类型生成对应的User子类
     * @param type
     * @return
     * @throws Exception
     */
    public static User createUser(String type) throws Exception{
        String userClassName= UserEnum.getUserClassName(type);
        Class clazz = Class.forName(userClassName);
        return (User)clazz.newInstance();
    }

 这样写的好处是后期新增User子类,只需要在枚举里面新增一条记录,不需要更改已运行的代码。(例:DUser("D","DUser"))

也可以使用Map实现相同的结果,各有优缺点,如何取舍可结合实际运用。

你可能感兴趣的:(简单工厂模式使用枚举+反射替代if-else写法)