继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用!
4.4 模式扩展
4.4.1 特点
- 简单工厂+ 配置文件构成
- 解除工厂对象和产品对象的耦合
- 配置文件:全类名
4.4.2 步骤
4.4.2.1 配置文件
- 使用properties作为配置文件,并放在Resources文件夹下,如图
american = com.demo.patternDesign.FactoryPattern.ConfigFactory.AmericanCoffee
latte = com.demo.patternDesign.FactoryPattern.ConfigFactory.LatteCoffee
4.4.2.2 其它文件
- 咖啡抽象类,和之前一样
- 美式咖啡和拿铁咖啡实现类,同之前
- 咖啡工厂类
public class CoffeeFactory {
// 加载配置文件,获取配置文件中配置的全类名,并创建该类的对象进行存储
// 定义容器对象存储咖啡对象
private static final HashMap<String, Coffee> map = new HashMap<String, Coffee>();
// 加载配置文件,只需要加载一次
static {
// 创建properties对象
Properties properties = new Properties();
// 调用load方法加载
InputStream resourceAsStream = CoffeeFactory.class.getClassLoader().getResourceAsStream("message.properties");
try {
properties.load(resourceAsStream);
// 从集合中获取全类名创建对象
Set<Object> keySet = properties.keySet();
for (Object o : keySet) {
String className = properties.getProperty((String) o);
// 通过反射技术创建对象
Class aClass = Class.forName(className);
Coffee coffee = (Coffee) aClass.newInstance();
// 将对象放在map里
map.put((String) o, coffee);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//根据名称获取对象
public static Coffee createCoffee(String name) {
return map.get(name);
}
}
- 测试结果符合预期,如图
public static void main(String[] args) {
Coffee american = CoffeeFactory.createCoffee("american");
System.out.println(american.getName());
System.out.println("===========================================");
Coffee latte = CoffeeFactory.createCoffee("latte");
System.out.println(latte.getName());
}