`
yongtree
  • 浏览: 233941 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

浅谈DAO工厂设计模式

阅读更多
随着软件分层设计的流行及广泛的应用,对于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工厂一些浅显的理解。现在正在学习设计模式,以后会根据自己的所学所思,介绍自己对各个设计模式的理解,希望大家一块学习讨论。

yongtree  2008-4-14 晚
分享到:
评论
8 楼 jxausea 2008-11-20  
楼主好强大!
7 楼 flynetcn 2008-05-05  
呵呵,回帖的人 文章数没过百的
6 楼 luckaway 2008-05-03  
解释的比较形象,good
5 楼 slaser 2008-04-21  
是不是可以把dao作成无状态的单例对象?
4 楼 Aryang 2008-04-14  
我理解楼主是在和大家分享学习设计模式的心得,工厂模式 可以很好的解耦,spring的IoC能更好的解耦
3 楼 dmewy 2008-04-14  
没看懂楼主到底想表达什么.
是DAO好还是DAO不好?还是如何实现一个松耦合的DAO..
2 楼 lisahyes 2008-04-14  
如果将对象的生成,
    对象属性的改变,
    对象方法的调用
等等所有操作全部都替换成方法调用

那么从技术手段上也就可以通过动态改变方法的指针这种相对比较简单的方法达到很多目的,比如说AOP类似的功能。

因此从设计角度上说,我们以前需要语法分析/编译分析才能做到的某些事情,现在通过加强代码规范和模式应用,也能做另外一个角度做到,并且抽象程度更高。

这是我的一点想法。
1 楼 xbwolf 2008-04-14  
使用spring来管理hibernate,就不会有这种困扰了。 楼主写的不错。

相关推荐

    DAO设计模式(工厂+代理)

    在这个“DAO设计模式(工厂+代理)”的例子中,我们将探讨如何结合工厂模式和代理模式来实现更灵活、更易于维护的DAO层。 首先,让我们理解DAO的基本概念。DAO是一个接口或抽象类,定义了对数据库进行操作的方法,...

    DAO设计模式 DAO 设计模式 JAVA设计模式

    在Java开发中,DAO模式通常与其他设计模式结合使用,如工厂模式(创建DAO实例)、策略模式(根据策略选择不同的数据访问方式)、单例模式(管理全局唯一的DAO实例)等,以进一步提升系统的灵活性和可维护性。...

    浅谈基于DAO的设计模式在构建BBS网站中的应用

    DAO(Data Access Object...通过合理地组织DAO接口和实现,以及结合其他设计模式,如抽象工厂,可以构建出高效、灵活且可扩展的BBS应用程序。在实际开发过程中,应充分理解和运用DAO模式,以提升软件的质量和可维护性。

    Dao设计模式教程

    DAO(Data Access Object)设计模式是一种软件设计模式,它用于封装对数据库的所有访问,从而将业务逻辑和数据访问逻辑分离开来。DAO模式的核心思想是创建一个接口或抽象类,代表一个特定的数据操作,然后创建该接口...

    MVC三层架构+DAO工厂模式进行JAVA WEB开发

    而DAO工厂模式则进一步抽象了DAO的创建过程,提供了一种灵活的方式来实例化不同类型的DAO,以操作不同的数据表或数据源。 1. **DAO(数据访问对象)**:包含具体的数据操作方法,如CRUD(Create, Read, Update, ...

    浅谈对于DAO设计模式的理解

    浅谈DAO设计模式的理解 DAO(Data Access Object)设计模式是一种常用的软件设计模式,它的主要目的是将业务逻辑与数据库访问相分离,降低耦合性,提高系统的可维护性和扩展性。下面是对DAO设计模式的理解和实现的...

    J2EE之DAO设计模式

    当底层数据储存实现不得不发生变化的时候, 我们可以用抽象工厂模式来实现这个策略. 在当前情况,可以提供一个抽象的DAO工厂对象(抽象工厂),用他来创建不同类型的具体DAO工厂,每一个工厂都各自支持一种不同的数据持久...

    DAO设计模式辅助资料

    3. **业务层**:业务逻辑层通过依赖注入或者工厂模式获取DAO实例,然后调用DAO接口的方法来完成数据处理任务,这样可以确保业务代码不直接与数据库打交道,降低了耦合度。 4. **事务管理**:在DAO实现中,通常需要...

    DAO设计模式DAO设计模式

    - **DAO工厂类**:负责创建不同的DAO实例。 - **DAO接口**:定义了数据访问的方法签名,通常包括增删改查等操作。 - **DAO具体实现类**:实现DAO接口,负责具体的数据库交互逻辑。 - **数据传递对象**(Data ...

    基于DAO工厂模式的三层架构示例项目源码

    DAO工厂模式是一种创建型设计模式,它提供了一种创建DAO对象的方式,使得在业务逻辑层可以根据需要动态地创建相应的DAO实例,而无需直接硬编码DAO的创建过程。在本项目中,DAO工厂可能包含一个或多个方法,每个方法...

    工厂模式dao模式操作数据库小例子

    工厂模式和DAO(Data Access Object)模式是两种常见的设计模式,它们在处理数据库操作时发挥着关键作用。本示例旨在帮助初学者理解如何结合这两种模式来高效地与数据库交互。 首先,我们来详细探讨工厂模式。工厂...

    工厂模式与DAO模式

    在软件设计模式中,工厂模式和DAO(Data Access Object)模式是两种常用的设计模式,它们在实际开发中扮演着至关重要的角色。工厂模式是创建型设计模式,它提供了一种创建对象的最佳方式,而DAO模式则是一种数据访问...

    李兴华DAO设计模式

    DAO(Data Access Object)设计模式是一种在软件开发中用于封装对数据库操作的模式,它将数据访问逻辑与业务逻辑分离,使得系统更易于维护和扩展。在这个设计模式中,DAO作为数据层,提供了对数据库的一系列原子性...

    Java DAO 设计模式.pdf

    5. **构建DAO工厂类**:通过工厂模式创建DAO实现类的实例。 6. **编写前端页面**:前端页面调用DAO工厂类,通过工厂返回的DAO实例进行数据库操作。 **示例:** 假设我们正在开发一个用户登录功能,可以通过以下步骤...

    WEB开发经典之 DAO设计模式

    DAO模式常常与其他设计模式结合使用,比如工厂模式用于创建DAO实例,单例模式控制DAO对象的唯一性,策略模式用于动态选择不同的数据访问策略等。 综上所述,DAO设计模式是Web开发中的一种重要实践,它有助于构建...

    基于DAO设计模式的新闻发布系统

    DAO(Data Access Object)设计模式是一种在软件工程中用于封装对数据库访问的模式,它将业务逻辑和数据访问逻辑分离,提高代码的可重用性和可测试性。在这个基于DAO设计模式的新闻发布系统中,我们可以深入探讨以下...

    JSP+Servlet+AJAX的dao设计模式

    **JSP+Servlet+AJAX DAO设计模式详解** 在Web开发中,DAO(Data Access Object)设计模式是一种常用的设计模式,用于将业务逻辑与数据访问层进行解耦,提高代码的可维护性和可复用性。本篇我们将深入探讨如何在JSP...

    DAO设计模式精讲(java web开发)

    在实际开发中,还可以结合其他设计模式,如工厂模式创建DAO实例,使用策略模式处理不同的数据访问策略,以进一步优化和扩展系统。 总的来说,DAO设计模式是Java Web开发中不可或缺的一部分,它有助于构建灵活、可...

Global site tag (gtag.js) - Google Analytics