耦合和解耦--工厂单例解耦

一.耦合和解耦
        耦合:
            ◇ 所谓的耦合指的是在软件开发中,在层与层之间产生了某种紧密的关系,这种关系可能会导致,在我们修改或者是替换某一层时会影响其他的层,像这种情况我们就称之为层与层之间产生了耦合。
            ◇ 由于耦合(层与层之间的紧密关系)可能会导致我们在修改某一层时影响到其他的层,而这严重违反了我们对软件进行分层的最初设想 -- 软件各层之间应该相互独立、互不干扰,在修改或者是替换某一层时,应该做到不       影响其他层。

        解耦:
            ◇ 去除耦合的过程,称为解耦。
            ◇ 首先应该在开发程序时保证不要胡乱传递只属于某一层特有的对象或跨层调用只属于某一层特有的方法,从而避免产生不必要的耦合。但是无论如何小心,层与层之间最终还是会有关系,对于这种无法避免的耦合,我们应       该想办法管理起来。

        解耦方式: 接口+配置文件+工厂

  

二.案例:

  1.1.案例: 使用 接口+配置文件+工厂 进行EasyMall项目中层与层之间的解耦
        -----------------------------------------
          1.1.引入接口
              将UserDao和UserService类改为UserDaoImpl和UserServiceImpl类, 创建UserDao和UserService接口, 并让UserDaoImpl和UserServiceImpl分别实现UserDao和UserService接口

        -----------------------------------------
          1.2.引入配置文件
              创建conf.properties文件, 添加如下配置:
                  UserDao=cn.tedu.dao.UserDaoImpl
                  UserService=cn.tedu.service.UserServiceImpl

    -----------------------------------------

  2.引入工厂(v3)
            public class BasicFactory {
                private static BasicFactory factory = new BasicFactory();
                //单例模式
                private BasicFactory(){}
                //返回工厂实例
                public static BasicFactory getFactory(){
                    return factory;
                }
                //根据配置文件中的配置项生产UserDao实例
                public <T> T getInstance(Class<T> clazz){//返回类型及传入类型是核心点
                    try {
                        String className = PropUtils.getValue(clazz.getSimpleName());//类的全限定名
                        Class clz = Class.forName(className);
                        return (T)clz.newInstance();
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException(e);
                      }
                  }
              }

        -----------------------------------------
        2.1.修改UserServiceImpl, 通过BasicFactory获取UserDao实例:
            private UserDao dao = BasicFactory.getFactory().getInstance(UserDao.class);
            
        -----------------------------------------    
        2.2.修改各类Servlet, 通过BasicFactory获取UserService实例:
            private UserService service = BasicFactory.getFactory().getInstance(UserService.class);

 

posted @ 2017-06-11 22:57  Gerald_X  阅读(659)  评论(0编辑  收藏  举报