使用反射和泛型实现简单工厂模式
程序员文章站
2024-01-20 16:13:22
...
先来看常见的工厂模式
/**
* @author ZJX
* @date 2021/10/7
* @description
*/
public class DeviceFactory {
public USB create(String device){
if("Mouse".equals(device)){
return new Mouse();
} else if("KeyBoard".equals(device)){
return new KeyBoard();
} else{
return null;
}
}
}
为何会如此设计?因为我们知道一个类名对应一个类。那其实也可以这样设计
/**
* @author ZJX
* @date 2021/10/7
* @description
*/
public class DeviceFactory {
//实体类在项目中的路径
String url = "com.gdpu.homework4.entity." ;
public USB create(String device){
try {
Class<?> aClass = Class.forName(url + device);
USB usb = (USB) aClass.newInstance();
return usb;
} catch (Exception e){
//如果出现异常,那么就返回空
return null;
}
}
}
那如果只是我们JAVA程序员的调用,不经过其他平台的调用,那么可以使用泛型和反射实现。
/**
* @author ZJX
* @date 2021/10/7
* @description
*/
public class DeviceFactory {
public USB create(Class<? extends USB> device){
try {
USB usb = device.newInstance();
return usb;
} catch (Exception e){
return null;
}
}
}
下面分析下三者的利弊
第一种 | 第二种 | 第三种 | |
---|---|---|---|
优点 | 构思简单,可定制化程度更高 | 代码简洁,第一种的某些情况下的优化 | 代码简洁 |
缺点 | 耦合度高,如果工厂生产的东西频繁变更,代码也会频繁变更 | 可定制程度不高,很大情况下只适用于需要实现无参构造的类 | 只适用于特定情况 |
总结:这里只是给大家提供个设计模式的实现思路,并没有说第二种第三种优于第一种,实际上第二第三种适用范围比第一种要小的多,最终选择哪个实现方式需要根据业务来判断。
上一篇: Vue.js图片预览插件
下一篇: 用lambda简化工厂设计模式