5.5 工厂模式扩展
简单工厂+配置文件解除耦合
(spring底层类似)
可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合。在工厂类中加载配置文件中的全类名,并通过反射技术创建对象进行存储,客户端如果需要对象,直接进行获取即可。
为了演示方便,我们使用properties文件作为配置文件,名称为bean.properties,配置文件内容如下:
american=factory.config_factory.AmericanCoffee
latte=factory.config_factory.LatteCoffee#如果冰咖啡饮品,直接添加全类名即可,咖啡工厂中代码不用修改
icecoffee =factory.config_factory.IceCoffee
java">//咖啡工厂
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 {@Overridepublic String getName() {return "美式咖啡";}public void show(){System.out.println("我是美式咖啡....");}
}
================================================// 拿铁咖啡类
public class LatteCoffee extends Coffee {@Overridepublic String getName() {return "拿铁咖啡";}
}
=======================================================//新增冰咖啡饮品,咖啡工厂类不用修改
public class MiXue extends Coffee{@Overridepublic 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());}
}