如何利用简单工厂、配置文件、反射技术实现解除耦合?

一、概述

现在比较流行的解构方式,有些不是通过设计模式之工厂设计模式(Factory Pattern)详细剖析介绍的三种模式来实现解耦操作。而是通过简单工厂、配置文件、反射技术来实现解耦。
在工厂类中加载配置文件中的全类名,并创建对象进行存储,客户端如果需要对象,直接进行获取即可。现在比较流行的框架,如Spring就是利用这种方式来实现解耦操作。

假设我们的类设计为:
在这里插入图片描述
具体的工厂代码如下:

public class SimpleCoffeeFactory {

    public Coffee createCoffee(String type){
        // 先创建一个coffee类型的变量,根据不同的类型创建不同的子类
        Coffee coffee = null;
        if("american".equals(type)){
            coffee = new AmericanCoffee();
        }else if("latte".equals(type)){
            coffee = new LatteCoffee();
        }else{
            throw new RuntimeException("对不起,你要点的咖啡我们没有");
        }
        return coffee;
    }
}

对于这种设计方法,我们知道耦合度太高了。并且不符合开闭原则。于是,我们想着能不能通过配置文件+反射来解决耦合度高的问题。

二、实现

1. 定义配置文件

为了演示方便,我们使用properties文件作为配置文件,名称为bean.properties
在这里插入图片描述
properties中记录的是全类名的信息:

american=com.fangshaolei.design.factory.config_factory.AmericanCoffee
latte=com.fangshaolei.design.factory.config_factory.LatteCoffee

2. 改造简单工厂

public class CoffeeFactory {
    // 加载配置文件,获取配置文件中配置的全类名,并创建该类的对象进行存储起来
    // 1. 定义容器对象存储咖啡对象
    private static  HashMap<String,Coffee> ioc = new HashMap<>();

    // 2. 加载配置文件,只需加载一次
    static{
        // 2.1 创建properties对象
        Properties properties = new Properties();
        // 2.2 调用properties对象中的load方法进行配置文件的加载
        InputStream is = com.fangshaolei.design.factory.factory_method.CoffeeFactory.class.getClassLoader().getResourceAsStream("bean.properties");
        try {
            properties.load(is);
            // 从p集合中获取全类名,并创建对象
            Set<Object> keys = properties.keySet();
            for (Object key : keys) {
                String className = properties.getProperty((String)key);
                // 通过反射技术创建对象
                Class clazz = Class.forName(className);
                Coffee coffee = (Coffee) clazz.getDeclaredConstructor().newInstance();
                // 将名称和对象存储到容器中
                ioc.put((String) key, coffee);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 根据名称获取对象
    public static Coffee createCoffee(String name){
        return ioc.get(name);
    }
}

静态成员变量用来存储创建的对象(键存储的是名称,值存储的是对应的对象),而读取配置文件以及创建对象写在静态代码块中,目的就是只需要执行一次。

三、总结

通过上述操作,就可以通过工厂模式+配置文件的方式解除工厂对象和产品对象的耦合,实际上Spring就利用了简单工厂+配置文件+反射技术实现了耦合。


参考:
https://blog.csdn.net/qq_39368007/article/details/113939394
https://www.kancloud.cn/sstd521/design/193520

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值