工厂设计模式

工厂模式
通过beanfactory进行解耦,在不同的数据库访问上会出现不同的daoimpl,我们在service上进行调用的时候,需要进行new,就会导致很大的耦合性,就需要改代码,我们需要的是工厂模式创建出来dao层的实现类来进行调用。这个时候通过修改配置文件就可以了。

思路:把各种实体类配置到application.xml上,然后通过工厂类对这个xml文件进行解析,
然后获取根节点,获取所有的bean节点,然后通过id属性判断和传递过来的name进行匹配,然后获取里面的class属性,然后通过反射去创建这个类的实例,返回创建的这个实例。

工厂类:解析xml,通过反射返回一个实例对象。
package cn.itcast.store.utils;

import cn.itcast.store.dao.UserDao;
import cn.itcast.store.domain.User;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;

public class BeanFactory {

//解析XML
public static Object createObject(String name) {
try {
//通过传递过来的name获取application.xml中name对应的class值

     //获取到Document对象
     SAXReader reader=new SAXReader();
     //如果获取application.xml文件的输入流 (application.xml必须位于src下)
     InputStream is=BeanFactory.class.getClassLoader().getResourceAsStream("application.xml");
     Document doc=reader.read(is);
     //通过Document对象获取根节点  beans
     Element rootElement = doc.getRootElement();
     //通过根节点获取到根节点下所有的子节点 bean,返回集合
     List<Element> list = rootElement.elements();
     //遍历集合,判断每个元素上的id的值是否和当前的name一致
     for (Element ele : list) {
        //ele相当于beans节点下的每个bean
        //获取到当前节点的id属性值
        //如果一致,获取到当前元素上class属性值
        String id=ele.attributeValue("id");
        if(id.equals(name)){
           String str=ele.attributeValue("class");
           //通过反射创建对象并且返回
           Class clazz=Class.forName(str);
           //利用class值通过反射创建对象返回
           return  clazz.newInstance();
           
        }
     }
  } catch (Exception e) {
     e.printStackTrace();
  }
  return null;

}

public static void main(String[] args) throws SQLException {
UserDao ud=(UserDao)BeanFactory.createObject(“UserDao”);
User user=new User();
user.setUsername(“aaa”);
user.setPassword(“aaa”);
User uu = ud.userLogin(user);
System.out.println(uu);
}

}

Application.xml如果获取application.xml文件的输入流 (application.xml必须位于src下配置bean的配置文件,id为文件中的设置的,class为想要创建具体对象的全路径

<?xml version="1.0" encoding="UTF-8"?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值