用枚举法实现工厂模型

用枚举法实现工厂模型

       接着上一篇博客,其实上一篇博客的工厂模型设计的不是很完善,设计的过程中暴露出一些问题。比如下面部分代码(截取上一篇博客)

public class FactoryPatternDemo {
	public static void main(String[] args) {
 // 获取工厂实例对象
		Pensonactory peosonfactory = new Pensonactory();
// 获取 Chinese 的对象,并调用它的 eat 方法
		Penson penson1 = peosonfactory.getperson("CHINESE");
//调用接口方法
       penson1.eat();
}

public class Pensonfactory {
	//使用 getShape 方法获取形状类型的对象
	   public Penson getperson(String type){
	      if(type == null){
	         return null;
	      }
	      if(type.equalsIgnoreCase("CHINESE")){
	         return new Chinese();
	      } else if(type.equalsIgnoreCase("AMERCIA")){
	         return new Amercia();
	      } 
	      return null;
	   }
}

分析代码
(1)程序是通过调用函数传递参数后,在工厂类进行实例化对象,这就暴露出一个问题,如果说传递的参数错误就会导致实例化对象为空指向。
(2)传递的参数是对应接口的具体类实现类,只是将字母其大写而已这就暴露出一个问题,将业务逻辑暴露给用户,不利于维护。
(3)代码量累赘,太多if判断语句,代码重复,一旦增加一个类时就要增加一个if判断语句。

解决方法
(1)采用枚举法,将一些参数先设定好防止参数传递错误。
(2)采用java反射机制进行实例化对象减少if语句。

枚举法实现工厂模型

(1)步骤一:创建枚举类

public enum PensonTypeEnum {
    //包名.类名
	CHINESE("entity.Chinese"),
    AMERCIA("entity.Amercia"),
    private String className;
    ShapeTypeEnum(String className) {//构造方法
        this.className = className;
    }
    public String getClassName() {
        return className;
    }

(2)步骤二:创建接口(跟上一篇博客一样)

(3)步骤三:创建具体实现类(跟上一篇博客一样)

(4)步骤四:创建工厂类

public class Pensonfactory {
	private Pensonfactory(){}//私有化构造方法
    public static Shape createpenson(PensonTypeEnum pensonTypeEnum){
        Penson penson = null;
        //获取具体类(字符串)
        String className = pensonTypeEnum.getClassName();
        try {
            //获取类
            Class clazz = Class.forName(className);
            //实例化对象
            penson = (Penson)clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return penson;
    }
    //测试
    public static void main(String[] args) {
    	 ShapeFactory.createpenson(PensonTypeEnum.CHINESE).eat();
         ShapeFactory.createpenson(PensonTypeEnum.AMERCIA).eat();         
	}
}

输出结果:
在这里插入图片描述

总结

       这种采用枚举法设计模式,相对于前一种方法是有比较好的。既防止参数的传递错误,有不暴露其业务逻辑。还有一点比较重要的是采用Java反射机制来实例化对象减少了if判断语句,增强代码的可读性,减少代码的重复率。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读