核心思想
- 通过配置文件和反射机制动态决定具体工厂的选择,减少客户端对具体工厂和具体产品的硬编码依赖,使系统更灵活、更易扩展。
- 改进点:
-
- 配置文件解耦:使用配置文件动态加载具体工厂类。
- 反射机制扩展:通过反射机制创建具体工厂对象,避免客户端直接依赖具体工厂类。
- 提升扩展性:新增产品族时无需修改客户端代码。
代码实现
1. 定义配置文件
americano=com.colin.patterns.creational_patterns.config_factory.Americano
latte=com.colin.patterns.creational_patterns.config_factory.Latte
2. 改进工厂类
package com.colin.patterns.creational_patterns.config_factory;
import java.util.HashMap;
import java.util.Properties;
public class CoffeeFactory {
// 1.定义容器Map,存储所有的咖啡对象
private static HashMap<String, Coffee> map = new HashMap<>();
// 2.加载配置文件
static {
// 2.1.创建Properties对象
Properties properties = new Properties();
// 2.2.加载配置文件
try {
properties.load(CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties"));
// 2.3.获取配置文件中所有的key
for (Object key : properties.keySet()) {
// 2.4.获取value
String className = properties.getProperty((String) key);
// 2.5.通过反射创建对象
Class clazz = Class.forName(className);
Coffee coffee = (Coffee) clazz.newInstance();
// 2.6.把key和value存入map中
map.put((String) key,coffee);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 根据name获取Coffee对象
public static Coffee createCoffee(String name) {
return map.get(name);
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Coffee americano = CoffeeFactory.createCoffee("americano");
System.out.println(americano.getName());
System.out.println("-----------------------------------------");
Coffee latte = CoffeeFactory.createCoffee("latte");
System.out.println(latte.getName());
}
}