浅谈DAO工厂模式

 
浅谈 DAO 工厂设计模式
      随着软件分层设计的流行及广泛的应用,对于 DAO 的设计模式大家已经不再陌生了, DAO 层已经在软件系统的开发中成为必不可少的一层,将后台的数据层和前台的 VO 进行分离。前段时间也针对于 DAO 的设计介绍过一个基于 Hibernate 的泛型 DAO 的设计。
 
      通过 DAO 的设计的确可以让我们的软件系统已经将数据层和表现层进行了简单的分离,让我们系统各层次的功能更加的清晰。所以我们开始洋洋得意了, DAO 的引入让系统的耦合性更加的松散,表现层再也不需要关心后台数据操作的变化了。于是我们开始高枕无忧了,我们肆无忌惮的在表现层通过调用 DAO 来实现我们的系统了。事实真的如此吗?那我们就举个例子来看看我们的系统是否真的具有解偶的能力了。
      现在我们有个员工管理系统,在该系统中, Person.java 表示员工这个对象,它对应着数据库中的 person 表。还有用于操作 Person 对象的 DAO 接口 —PersonDAO.java ,还有一个 PersonDAO 的实现类 PersonDAOImpl.java 。在 PersonDAOImpl.java 中我们实现了操作 Person 对象的所有的方法。我们很自豪的说,看我们已经把操作封装在 PersonDAO 中了,现在我们可以在表现层( jsp ,或者 VO 操作类中)使用 PersonDAO personDAO=new PersonDAOImpl() 来调用 DAO 操作我们的数据对象了。当我们陶醉于自己写的优美的代码的时候,项目经理来通知了,由于使用 Hibernate 的效率偏低,客户开始不满了,还是让我们重新用 JDBC 再重写一遍吧。于是所有 DAO Hibernate 实现开始全部转换成 JDBC 实现。但是项目经理建议不要破坏现有的 Hibernate 实现,以后可以通过技术研究来提升 Hibernate 的访问效率。于是我们开始写了又写了一套 JDBC 的实现 —PersonDAOJDBCImpl.java ,现在问题出来了,表现层大量的使用了 PersonDAO personDAO=new PersonDAOImpl() ,全部改成 new PersonDAOJDBCImpl() 谈何容易,我们是不是开始欲哭无泪了。
      怎么解决类似的问题呢?于是我们开始引进工厂模式。我们建立一个类 DaoFactory.java DAO 进行统一管理。
DaoFactory.java:
      public class DaoFactory{
      public static PersonDAO getPersonDAOInstance()
      {
           return new PersonDAOImpl() ;
      }
      // 得到其他的 DAO 实例
      ……
}
表现层通过 PersonDAO personDAO=DaoFactory.get getPersonDAOInstance(); 来实例化 DAO 实例。这样问题就解决了, DAO 改变了,我们只需要在 DAO 工厂类中修改一下代码: return new PersonDAOJDBCImpl() ; 那我们的应用就快速切换到 JDBC 实现了。可见利用工厂模式,我们的系统又进一步的解耦,表现层真的无需再关系 DAO 层的变化了,一切交给 DAO 工厂来解决。
使用过 Spring 这样框架的开发人员都知道, Spring 通过利用 IoC 来实现类之间的解耦。其实在 DAO 工厂中我们也可以简单的借鉴一下 IoC 的思想,更进一步解除类之间的耦合。 Spring 是通过配置 xml 文件来进行 IoC 的,那么我们也可以借助于 xml 文件来实现。比如下面的 xml
<? xml version = "1.0" ?>
< config >
    < daos >
       <!-- 组织机构服务接口实现类 -->
       < dao id = "organizationService"
           type = "com.baiyyy.oa.services.organization.OrganizationServiceImpl" >
       </ dao >
       <!-- 工作流参与者接口 -->
       < dao id = "participantService"
           type = "com.baiyyy.workflow.services.impl.ParticipantServiceImpl" >
       </ dao >
       <!-- 工作流定义接口 -->
       < dao id = "processDefinitionService"
           type = "com.baiyyy.workflow.services.impl.ProcessDefinitionServiceImpl" >
       </ dao >
       <!-- 工作流实例接口 -->
       < dao id = "processInstanceService"
           type = "com.baiyyy.workflow.services.impl.ProcessInstanceServiceImpl" >
       </ dao >
    </ daos >
</ config >
这是我设计实现的工作流系统给业务系统提供的接口所配置的 xml ,所有的接口都配置在 xml 中,我们怎么使用呢?我只不过是把 DAO 工厂进行进一步的改进,通过 ProcessInstanceService processInstanceService=DaoFactory.getDao(ProcessInstanceService.class,” processInstanceService”); 从传入的参数我们可以看出,我们清楚的知道要调用的接口 ProcessInstanceService ,同时通过字符串 ” processInstanceService” ,我们可以解析上面的配置文件,得到具体实现类的路径,通过反射得到该实现类的实例。具体的 DAO 工厂类的实现,朋友们有兴趣可以自己去实现,我就不详细介绍了。
      终于写完了,以上便是对 DAO 工厂一些浅显的理解。现在正在学习设计模式,以后会根据自己的所学所思,介绍自己对各个设计模式的理解,希望大家一块学习讨论。
 
yongtree  2008-4-14
 
<script type="text/JavaScript"> alimama_pid="mm_10550794_1003415_2157144"; alimama_titlecolor="0000FF"; alimama_descolor ="000000"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="E6E6E6"; alimama_linkcolor="008000"; alimama_bottomcolor="FFFFFF"; alimama_anglesize="0"; alimama_bgpic="0"; alimama_icon="0"; alimama_sizecode="13"; alimama_width=250; alimama_height=60; alimama_type=2; </script><script src="http://a.alimama.cn/inf.js" type=text/javascript> </script>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值