简单工厂:三个角色 抽象产品 具体产品 具体工厂
优点: 用户看不到对象是如何创建的 缺点:每新增一个类的时候 都要去修改工厂 不满足开闭原则
拓展:可以与配置文件一起联合使用
package com.qf.factorydemo.simplefactory;
/**
* 简单工厂模式 不属于23 种设计模式
* 包含三个角色
* 抽象产品
* 具体产品
* 具体工厂
*
* 缺点 新增一个coffee 就要修改 工厂类里面的制作方法 不满足开闭原则
*/
public class SimpleFactory {
//获取Coffee对象的方法
public static Coffee getCoffee(String name) {
if ("蓝山咖啡".equals(name)) {
return new LScoffee();
} else if ("雀巢咖啡".equals(name)) {
return new QCcoffee();
}
throw new RuntimeException("咖啡不在");
}
}
package com.qf.factorydemo.config_simplefactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
//简单工厂+配置文件 完成解耦
public class CoffeeFactory {
//加载配置文件 ,获取配置中的全类名 并创建该对象进行存储
//1.定义容器
private static Map<String, Coffee> coffeeMap = new HashMap<String, Coffee>();
//2.加载配置文件 只需加载一次
static {
//2.1创建properties 对象
Properties properties = new Properties();
//2.2调用load 方法
InputStream resourceAsStream = CoffeeFactory.class.getClassLoader().getResourceAsStream("beans.properties");
try {
properties.load(resourceAsStream);
//从properties获取全类名 并创建对象
Set<Object> keys = properties.keySet();
for (Object key : keys) {
String className = properties.getProperty((String) key);
//通过反射创造对象
Class clazz = Class.forName(className);
Coffee coffee = (Coffee) clazz.newInstance();
//将对象存储到容器中
coffeeMap.put((String) key, coffee);
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException();
}
}
//根据名称获取对象
public static Coffee creatCoffee(String key) {
return coffeeMap.get(key);
}
}