运用工厂模式解耦的实现

初始化环境: pom文件导入依赖
<dependencies>
    <!--dom4j-->
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6.1</version>
    </dependency>
    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>
创建业务层接口和实现类
/**
* 账户的业务层接口
*/
public interface AccountService {
    
    
    /**
    * 保存账户(此处只是模拟,并不是真的要保存)
    */
    void saveAccount();
}
/**
* 账户的业务层实现类
*/
public class AccountServiceImpl implements AccountService {
    
    
    	
    /* 
     在我们使用三层架构作为开发基础时,层和层之间的调用,如果使用具体实现类就会出现内容依赖。
     在需要更换实现时,就需要修改源码,造成当前业务层功能的独立性很差。同时给我们维护带来极大不便。
     */
    //存在代码耦合问题
    //private AccountDao accountDao = new AccountDaoImpl();
    
    //采用工厂类进行解耦
    private AccountDao accountDao = (AccountDao)BeanFactory.getBean("AccountDao");
    
    @Override
    public void saveAccount() {
    
    
        //调用dao层的保存账户的方法
    	accountDao.saveAccount();
    }
}
创建持久层接口和实现类
/**
* 账户的持久层接口
*/
public interface AccountDao {
    
    
    /**
    * 保存账户
    */
    void saveAccount();
}
/**
* 账户的持久层实现类
*/
public class AccountDaoImpl implements AccountDao {
    
    
    @Override
    public void saveAccount() {
    
    
    	System.out.println("保存了账户");
    }
}
配置文件 beans.xml
<?xml version="1.0" encoding="utf-8" ?>
<beans>
    <!--配置dao-->
    <bean id="AccountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean>
    <!--配置service-->
    <bean id="AccountService" class="com.itheima.service.impl.AccountServiceImpl"></bean>
</beans>
工具类
/**
 * 创建接口实现类对象的 工厂类
 */
public class BeanFactory {
    
    

    //指定Map集合 , 用于存接口与实现类对象
    private static Map<String, Object> map = new HashMap<>();

    //通过静态代码块 实现解析XML文件
    static {
    
    
        /*
        使用Dom4j技术, 进行解析XML文件
        1.加载xml文件,得到Document对象
        2.通过Document对象 获取beans节点标签, 获取到每一个Bean节点标签( 获取id属性, class属性)
        3.反射创建 class属性 对应的接口实现类对象
        4.把键值对关系 存入Map集合
         */

        try {
    
    
            //加载xml文件,得到Document对象
            SAXReader saxReader = new SAXReader();
            InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
            Document document = saxReader.read(inputStream);
            //通过Document对象 获取beans节点标签, 获取到每一个Bean节点标签( 获取id属性, class属性)
            Element beans = document.getRootElement();
            //获取所有bean标签
            List<Element> beanList = beans.elements();
            for (Element bean : beanList) {
    
    
                //获取到每一个Bean节点标签( 获取id属性, class属性)
                String idValue = bean.attributeValue("id");
                String classValue = bean.attributeValue("class");
                //反射创建 class属性 对应的接口实现类对象
                Object obj = Class.forName(classValue).newInstance();
                //把键值对关系 存入Map集合
                map.put(idValue, obj);
            }

        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 提供一个方法,接收接口名称, 返回接口实现类对象
     * @param id 接口名称
     * @return 返回接口实现类对象
     */
    public static Object getBean(String id){
    
    
        Object obj = map.get(id);
        return obj;
    }
}
测试
public class AccountServiceTest {
    
    

    @Test
    public void saveAccount() {
    
    
        //创建Service对象, 调用保存账户方法
        //AccountService accountService = new AccountServiceImpl();

        AccountService accountService = (AccountService) BeanFactory.getBean("AccountService");
        accountService.saveAccount();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_47785112/article/details/107384649