随着软件分层设计的流行及广泛的应用,对于DAO的设计模式大家已经不再陌生了,DAO层已经在软件系统的开发中成为必不可少的一层,将后台的数据层和前台的VO进行分离。前段时间也针对于DAO的设计介绍过一个基于Hibernate的泛型DAO的设计。

csdn blog:http://blog.csdn.net/yongtree/archive/2008/03/12/2172071.aspx 
javaeye blog:http://yongtree.iteye.com/blog/170449

通过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工厂一些浅显的理解。现在正在学习设计模式,以后会根据自己的所学所思,介绍自己对各个设计模式的理解,希望大家一块学习讨论。 

浅谈DAO工厂设计模式(工厂模式的好处)的更多相关文章

  1. 浅谈cocos2dx(18) 中工厂模式

    ----我的生活.我的点点滴滴! ! cocos2d-x中也有工厂模式.何为工厂模式,顾名思义就是用来产生产品的,工厂就是用来创建其它类对象的类,我们把这个创建其它类对象的类叫做工厂类.而这些被创建的 ...

  2. android开发之路06(浅谈单例设计模式)

    设计模式之单例模式: 一.单例模式实现特点:①单例类在整个应用程序中只能有一个实例(通过私有无参构造器实现):②单例类必须自己创建这个实例并且可供其他对象访问(通过静态公开的访问权限修饰的getIns ...

  3. 浅谈命令查询职责分离(CQRS)模式

    在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体.在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能 ...

  4. 浅谈JavaScript中的原型模式

    在JavaScript中创建对象由很多种方式,如工厂模式.构造函数模式.原型模式等: <pre name="code" class="html">/ ...

  5. 转:浅谈命令查询职责分离(CQRS)模式

    原文来自于:http://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html 在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查 ...

  6. 浅谈常用的设计模式(new)

    简单工厂模式 抽象工厂模式 代理模式 装饰者模式(Decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰着模式比生成子类更加灵活. 建造者模式:builder构建

  7. 浅谈命令查询职责分离(CQRS)模式---转载

    在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体.在一些业务逻辑简单的系统中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能 ...

  8. 【转】浅谈命令查询职责分离(CQRS)模式

    原文链接:https://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html 在常用的三层架构中,通常都是通过数据访问层来修改或者查询数据,一般修改和查 ...

  9. 浅谈 JavaScript 中的继承模式

    最近在读一本设计模式的书,书中的开头部分就讲了一下 JavaScript 中的继承,阅读之后写下了这篇博客作为笔记.毕竟好记性不如烂笔头. JavaScript 是一门面向对象的语言,但是 ES6 之 ...

随机推荐

  1. Selenium3+python自动化016-Selenium Grid

    一.Selenium Grid介绍 1.概念 Selenium Grid组件专门用于远程分布式测试或并发测试,通过并发执行测试用例的方式可以提高测试用例的执行速度和效率,解决界面自动化测试执行速度过慢 ...

  2. maven依赖报红的一些解决办法

    使用IDEA集成maven管理项目依赖时,经常出现更改pom文件后maven依赖列表并未更改,且依赖报红,此时建议检查maven配置文件maven仓库是否下载好jar包,如果未下载好jar包文件夹内会 ...

  3. 常用的一些git命令整合

    一.创建一个版本库 1.mkdir xxx 2.git init 使用git init命令将这个目录变成Git可以管理的仓库 这个版本仓库创建好了,xxx目录下有一个隐藏的.git目录(里面有暂存区( ...

  4. vsftpd最详细的配置文件

    vsftpd作为一个主打安全的FTP服务器,有很多的选项设置.下面介绍了vsftpd的配置文件列表,而所有的配置都是基于vsftpd.conf这个配置文件的.本文将提供完整的vsftpd.conf的中 ...

  5. mysql权限过滤

    1.用like做权限过滤 上级部门可以看到下级部门发布的正式文件,下级部门不能看到上级部门发布的正式文件 SELECT*FROM cms_nrgl_st a, mz_xzjg bWHERE a.sys ...

  6. 最大流算法之Ford-Fulkerson算法与Edmonds–Karp算法

    引子 曾经很多次看过最大流的模板,基础概念什么的也看了很多遍.也曾经用过强者同学的板子,然而却一直不会网络流.虽然曾经尝试过写,然而即使最简单的一种算法也没有写成功过,然后对着强者大神的代码一点一点的 ...

  7. P5168 xtq玩魔塔 [克鲁斯卡尔重构树+带修莫队]

    P5168 xtq玩魔塔 又是码农题- 利用克鲁斯卡尔重构树的性质 我们就可以得出 \(dep\) 值小的,肯定比 \(dep\) 大的值要优. 于是第二问就可以直接 LCA 求出来了- 至于第三问, ...

  8. 【vue 权威指南】 学习笔记 二

    1.指令 1.1内部指令 基础指令:v-show , v-else , v-model , v-repeat , v-for , v-text , v-el , v-html , v-on , v-b ...

  9. create_function()代码注入

    00x00create_function()函数的简介 适用范围:PHP 4> = 4.0.1,PHP 5,PHP 7 功能:根据传递的参数创建匿名函数,并为其返回唯一名称. 语法: creat ...

  10. Latex字体属性

    Latex字体有五种属性:编码.族.系列.尺寸.形状:其中,一般用户不会涉及字体的编码属性.用户可以自定义字体属性,定义属性的命令称为声明,声明无参数,直接在文档中使用.1. 族(family)属性: ...