Java设计模式——工厂模式扩展

发布于:2024-10-13 ⋅ 阅读:(128) ⋅ 点赞:(0)

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());

    }
}

网站公告

今日签到

点亮在社区的每一天
去签到