用枚举法实现工厂模型

用枚举法实现工厂模型

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

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判断语句,增强代码的可读性,减少代码的重复率。

欢迎访问我的个人博客

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海面有风

您的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值