【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
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
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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
输出结果:
# 总结
这种采用枚举法设计模式,相对于前一种方法是有比较好的。既防止参数的传递错误,有不暴露其业务逻辑。还有一点比较重要的是采用 Java 反射机制来实例化对象减少了 if 判断语句,增强代码的可读性,减少代码的重复率。