【JAVA】:用枚举法实现工厂模型

2020/5/23 Java

# 用枚举法实现工厂模型

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

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

1
2
3
4
5
6
7
8
9
10
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
4
5
6
7
8
9
10
11
12
13
14

分析代码 (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;
    }
1
2
3
4
5
6
7
8
9
10
11

(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();
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

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

# 总结

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