核心思想
- 通过配置文件和反射机制动态决定具体工厂的选择,减少客户端对具体工厂和具体产品的硬编码依赖,使系统更灵活、更易扩展。
- 改进点:
-
- 配置文件解耦:使用配置文件动态加载具体工厂类。
- 反射机制扩展:通过反射机制创建具体工厂对象,避免客户端直接依赖具体工厂类。
- 提升扩展性:新增产品族时无需修改客户端代码。
代码实现
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.获取配置文件中所有的keyfor (Object key : properties.keySet()) {// 2.4.获取valueString 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());}
}