利用“工厂模式+反射+配置文件”来实现解耦和

来源:互联网 发布:JavaScript target 编辑:程序博客网 时间:2024/05/16 05:25

       我们在利用java的三层架构开发时,如果用Web层直接创建service层,然后再用service层直接创建dao层 ,这样的话如果我们底层的实现类发生了变化,我们就要去修改源代码了,这很显然不是很符合开发的要求。那这个问题应该怎么解决呢?对,我们可以通过利用“工厂模式+反射+配置文件”的模式来降低耦合度,从而只是通过修改配置文件就能实现我们的需求。

下面我们先通过案例的形式来分析一下传统模式、工厂模式的不足。

在此我们先规定几个类,就不在下面一一写了,各位看客要根据这几个类去看后面的内容奥。

Dao层的接口 USerDao Dao层的实现类UserDaoImp

BeanFactory类为工厂类

传统方式:

//创建dao层的实现类对象

UserDao userDao = new UserDaoImp;

       对于传统方式如果实现类对象由于需求改变导致发生变化,我们就需要将原有的实现类对象都改变为新的实现类对象,这显然不符合我们的OCP原则,而且需要修改的地方如果非常多的话,那这样的工作量也是非常的大的。

(OCP原则解释:对程序扩展是开放的,对修改代码是关闭的。)

工厂模式:

      我们在接口和实现类之间通过一个工厂类(BeanFactory)来降低耦合从而见少我们修改代码的工作量。如图:



       这样我们需求发生改变时导致实现类发生改变时,我们就只需要修改工厂类中的实现类对象了,但是这样还是需要去修改源码,容错率还是比较高的,怎么样可以不修改源码呢?

工厂模式+反射+配置文件的方式完成程序解耦和:

这里我们需要用到dom4j去解析xml文件所以需要导两个jar包:

xml文件的文件名为applicationContext.xml

Xml文件名为中的内容如下:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xml version="1.0" encoding="UTF-8"?><beans><bean id="UserDao" class="store.dao.impl.UserDaoImpl"></bean><bean id="ProductDao" class="store.dao.impl.ProductDaoImpl"></bean><bean id="OrderDao" class="store.dao.impl.OrderDaoImpl"></bean></beans></span>

BeanFactory类中的代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;">import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class BeanFactory {//将父接口作为id作为参数传递过来,来实现调用不同的实现类public static Object getBean(String id){try {//创建SAXReader对象来读取配置文件SAXReader reader = new SAXReader();//读取配置文件的内容,获得Document对象Document document = reader.read(BeanFactory.class.getClassLoader().getResourceAsStream("applicationContext.xml"));//利用XPath来读取到class元素Element beanElement = (Element)document.selectSingleNode("//bean[@id='"+id+"']");//获取到class后的路径String value = beanElement.attributeValue("class");System.out.println(value);//利用反射获得实现类对象Class clazz = Class.forName(value);return clazz.newInstance();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}</span>
       我们通过这种形式就不用修改源代码了,而是可以通过修改配置文件中的标签<bean></bean>中的内容来实现我们的需求了从而降低了容错率。





0 0
原创粉丝点击