一、概述
现在比较流行的解构方式,有些不是通过设计模式之工厂设计模式(Factory Pattern)详细剖析介绍的三种模式来实现解耦操作。而是通过简单工厂、配置文件、反射技术来实现解耦。
在工厂类中加载配置文件中的全类名,并创建对象进行存储,客户端如果需要对象,直接进行获取即可。现在比较流行的框架,如Spring
就是利用这种方式来实现解耦操作。
假设我们的类设计为:
具体的工厂代码如下:
public class SimpleCoffeeFactory {
public Coffee createCoffee(String type){
// 先创建一个coffee类型的变量,根据不同的类型创建不同的子类
Coffee coffee = null;
if("american".equals(type)){
coffee = new AmericanCoffee();
}else if("latte".equals(type)){
coffee = new LatteCoffee();
}else{
throw new RuntimeException("对不起,你要点的咖啡我们没有");
}
return coffee;
}
}
对于这种设计方法,我们知道耦合度太高了。并且不符合开闭原则。于是,我们想着能不能通过配置文件+反射来解决耦合度高的问题。
二、实现
1. 定义配置文件
为了演示方便,我们使用properties
文件作为配置文件,名称为bean.properties
。
在properties
中记录的是全类名的信息:
american=com.fangshaolei.design.factory.config_factory.AmericanCoffee
latte=com.fangshaolei.design.factory.config_factory.LatteCoffee
2. 改造简单工厂
public class CoffeeFactory {
// 加载配置文件,获取配置文件中配置的全类名,并创建该类的对象进行存储起来
// 1. 定义容器对象存储咖啡对象
private static HashMap<String,Coffee> ioc = new HashMap<>();
// 2. 加载配置文件,只需加载一次
static{
// 2.1 创建properties对象
Properties properties = new Properties();
// 2.2 调用properties对象中的load方法进行配置文件的加载
InputStream is = com.fangshaolei.design.factory.factory_method.CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties");
try {
properties.load(is);
// 从p集合中获取全类名,并创建对象
Set<Object> keys = properties.keySet();
for (Object key : keys) {
String className = properties.getProperty((String)key);
// 通过反射技术创建对象
Class clazz = Class.forName(className);
Coffee coffee = (Coffee) clazz.getDeclaredConstructor().newInstance();
// 将名称和对象存储到容器中
ioc.put((String) key, coffee);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 根据名称获取对象
public static Coffee createCoffee(String name){
return ioc.get(name);
}
}
静态成员变量用来存储创建的对象(键存储的是名称,值存储的是对应的对象),而读取配置文件以及创建对象写在静态代码块中,目的就是只需要执行一次。
三、总结
通过上述操作,就可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合,实际上Spring就利用了简单工厂+配置文件+反射技术实现了耦合。
参考:
https://blog.csdn.net/qq_39368007/article/details/113939394
https://www.kancloud.cn/sstd521/design/193520