思想
通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合,(即需要扩展新的对象时,不再需要修改抽象工厂和具体工厂。)
在工厂类中加载配置文件中的全类名,并创建对象进行存储,客户端如果需要对象,直接进行获取即可。
代码实现
- 定义配置文件:
american = pattern.factory.config_factory.AmericanCoffee
latte = pattern.factory.config_factory.LatteCoffee
- 改进工厂类:
public class CoffeeFactory {
private static Map<String,Coffee> map = new HashMap();
static {
Properties p = new Properties();
InputStream is =
CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties");
//getResourceAsStream是ClassLoader的一个方法,指定资源名称获取输入流。
try {
p.load(is);
//遍历Properties集合对象
Set<Object> keys = p.keySet();
for (Object key : keys) {
//根据键获取值(全类名)
String className = p.getProperty((String) key);
//获取字节码对象
Class clazz = Class.forName(className); //通过类的全限定名获取类对象
Coffee obj = (Coffee) clazz.newInstance();//Class类对象的方法,返回一个实例对象,底层调用无参构造,已被淘汰。
map.put((String)key,obj);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Coffee createCoffee(String name) {
return map.get(name);
}
}
总结
静态成员变量用来存储创建的对象(键存储的是名称,值存储的是对应的对象),而读取配置文件以及创建对象写在静态代码块中,目的就是只需要执行一次。