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

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的源码级别的课程和一些基础知识,总之,一切都是为了解耦!

 

 

你可能感兴趣的:(Spring源码分析篇,java)