Java设计模式——工厂模式扩展
5.5 工厂模式扩展
简单工厂+配置文件解除耦合
(spring底层类似)
可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合。在工厂类中加载配置文件中的全类名,并通过反射技术创建对象进行存储,客户端如果需要对象,直接进行获取即可。
为了演示方便,我们使用properties文件作为配置文件,名称为bean.properties,配置文件内容如下:
american=factory.config_factory.AmericanCoffee
latte=factory.config_factory.LatteCoffee
#如果冰咖啡饮品,直接添加全类名即可,咖啡工厂中代码不用修改
icecoffee =factory.config_factory.IceCoffee
//咖啡工厂
public class CoffeeFactory {
//加载配置文件,获取配置文件中配置的全类名,并创建全类名的类的对象进行存储
// 1.定义容器存储咖啡对象
private static Map<String,Coffee> map = new HashMap();
// 2.静态代码块 加载配置文件,只需加载一次
static {
// 2.1创建Properties对象
Properties p = new Properties();
// 2.2调用p对象中的load方法进行配置文件的加载
InputStream is =
CoffeeFactory.class
.getClassLoader()
.getResourceAsStream("bean.properties");
try {
p.load(is);
//从p集合中获取全名并创建对象
//遍历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();
map.put((String)key,obj);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 根据名称获取对象
public static Coffee createCoffee(String name) {
return map.get(name);
}
}
============================================================
// 咖啡类(父类)
public abstract class Coffee {
public abstract String getName();
public void addMilk(){
System.out.println("加奶...");
}
public void addSugar(){
System.out.println("加糖...");
}
}
=================================================
// 美式咖啡类
public class AmericanCoffee extends Coffee {
@Override
public String getName() {
return "美式咖啡";
}
public void show(){
System.out.println("我是美式咖啡....");
}
}
================================================
// 拿铁咖啡类
public class LatteCoffee extends Coffee {
@Override
public String getName() {
return "拿铁咖啡";
}
}
=======================================================
//新增冰咖啡饮品,咖啡工厂类不用修改
public class MiXue extends Coffee{
@Override
public String getName() {
return "冰咖啡";
}
}
==================================================
public class Test {
public static void main(String[] args) {
//直接通过配置文件中对应的美式咖啡名字 获取美式咖啡对象
Coffee american = CoffeeFactory.createCoffee("american");
american.addMilk();
american.addSugar();
System.out.println(american.getName());
//直接通过配置文件中对应的冰咖啡名字 获取冰咖啡对象
//新增冰咖啡
Coffee icecoffee = CoffeeFactory.createCoffee("icecoffee");
icecoffee.addSugar();
icecoffee.addMilk();
System.out.println(icecoffee.getName());
}
}