为什么工厂模式可以解耦?(二)

1、回顾(一)

上节我已经基本说明了耦合,以及在一些业务上是怎么发生的,实际上我们要理解一个思想,传统的EJB开发模式,因为受到了很多很多的框架硬性约束,web容器的约束

导致了代码的可读性,可移植和可扩展性变得不好,所以有这些解耦的思想,我们才会在03年spring的广泛流行!

回顾上节末尾:我们是不是遗留了一个问题,如果我们在工厂中,每次有一个新的对象,我们就需要手动的加一个对应的getBean方法,可重用性大大降低,所以我们称下面的代码,叫做

---------------------------简单工厂------------------------------------

/**
 * 定义一个bean工厂,专门生产普通对象
 */
public class BeanFactory {
 
    private static Properties properties = new Properties();
 
    //1.加载配置文件
    static {
        InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
        try {
            properties.load(resourceAsStream);
            resourceAsStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
 
    public static UserDao getBean(String key){
        // 2.使用key获得value
        String className = properties.getProperty(key);
        // 3.使用value利用反射技术创建对象
        try{
            return (UserDao) Class.forName(className).newInstance();
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

那么为了避免多个不同的对象在实际生产业务中,代码的繁重,我们将这个简单工厂,改造成通用工厂

/**
 * 定义一个bean工厂,专门生产普通对象
 */
public class BeanFactory {

    private static Properties properties = new Properties();

    //1.加载配置文件
    static {
        InputStream resourceAsStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
        try {
            properties.load(resourceAsStream);
            resourceAsStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

//    来个对象就要在工厂创建一个
//    public static UserDao getMysqlBean() {
//        return new UserDaoMysqlImpl();
//    }
//
//    public static UserDao getOracleBean() {
//        return new UserDaoOracleImpl();
//    }

//    来个对象就要在工厂创建一个,冗余代码太多
//    public static UserDao getBean(String key){
//        // 2.使用key获得value
//        String className = properties.getProperty(key);
//        // 3.使用value利用反射技术创建对象
//        try{
//            return (UserDao) Class.forName(className).newInstance();
//        }catch(Exception e){
//            e.printStackTrace();
//            return null;
//        }
//    }

    /**
     * 通用工厂方法,不必要一个新来对象就要创建一个getBean
     * @param key
     * @return
     */
    public static Object getBean(String key){
        Object ret = null;
        String className = properties.getProperty(key);
        // 3.使用value利用反射技术创建对象
        try{
            ret = Class.forName(className).newInstance();
        }catch(Exception e){
            e.printStackTrace();
        }
        return ret;
    }
}

这样的话,是不是我们只需要在配置文件中这么写:

userDao=com.chenxin.gmall.user.demo.dao.UserDaoSqlServerImpl
userService=com.chenxin.gmall.user.demo.service.UserServiceImpl

在需要创建对象的地方,我们只需要强制转换下:

UserDao userDao = (UserDao) BeanFactory.getBean("userDao");
......

我们想在哪里生成一个接口的实现类,只要你存在这个接口的实现,我们就可以定义在配置文件中,然后在你需要生成的地方调用即可!

后续我继续发布spring的源码级别的课程和一些基础知识,总之,一切都是为了解耦!

 

 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风清扬逍遥子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值