DAO模式和抽象工厂模式在系统设计中的应用

引用
在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用。


设计模式之Factory
http://www.jdon.com/designpatterns/designpattern_factory.htm

简单工厂模式讲解及实例:
http://www.cnblogs.com/zzj-46000452/archive/2006/09/16/506286.html

Java设计模式圣经连载(01)-简单工厂模式
http://lavasoft.blog.51cto.com/62575/11345

http://beniao.blog.51cto.com/389148/102304

http://www.ahcit.com/lanmuyd.asp?id=3069

简单工厂,工厂方法与抽象工厂区别体会
http://www.cnblogs.com/millen/archive/2009/02/13/1389974.html

DAO模式和抽象工厂模式在系统设计中的应用

刘锋  王琼瑶
(南通职业大学电子工程系,江苏 南通 226007)

    摘   要 业务变更和技术发展对软件系统的可扩展性和可维护性提出了高要求。本文以购物车系统为例,将DAO模式和Abstract Factory模式用于业务层的设计,使系统具有更强的灵活性。
    关键词 DAO;工厂模式;MVC;数据源


1 引言

    好的设计模式给系统提供一条可行方案的同时,也可大大降低其实现难度,还为后期的维护和升级提供灵活性。目前居于主流的设计思想是MVC[1]模式,但MVC模式仅仅给出了一个系统层次划分的总体思想,达到应用层、控制层、模式层的分离。如何灵活的实现之,则方法各异。本文的设计是在MVC框架下,对于业务层的设计结合DAO模式[2]和Abstract Factory模式[3],使系统框架更灵活,方便业务的变更和维护。
    利用DAO模式和Abstract Factory模式,本设计方案可解决如下问题:
    (1)对数据源的完成透明性。
    (2)方便的用户功能扩展性。
    (3)方便的维护性。
    (4)灵活的系统参数配置。
2 DAO模式和工厂模式

2.1 DAO模式

    DAO模式(Data Access Object数据访问对象),主要是描述对象的访问方式。它隐藏了底层的数据库访问细节。通过DAO组件,可实现业务逻辑和数据库访问的分离,避免业务逻辑与具体的数据库访问实现耦合,使业务逻辑层更加专注于业务逻辑,而无须理会持久层的实现细节。其基本原理如图1所示。



图1 DAO原理图

    图1是DAO简单原理图,其表达的核心思想有:
    (1)业务对象BusinessObject,DAO,数据访问层DAL分离。
    (2)业务对象BusinessObject通过DAO完成业务操作。
    (3)若需要持久化操作的,DAO调用DAL来完成持久化。
    (4)业务层BLL通过传递JavaBean/BO[4]与DAO层通信。
2.2 工厂模式

    工厂就是生成产品(对象)的地方,与类的构造函数有点类似。对于复杂的对象生产过程,比如按条件生成不同的对象实体时,不适合用类的构造函数实现(这样会导致构造函数过于复杂),进而用工厂方式代替。工厂模式其简单的实质性的内容就是:提供创建对象的接口,工厂按用户需求定制产品。
    工厂模式分工厂方法(Factory Method)和抽象工厂(Abstract Factory)。这两个模式区别在于需要创建对象的复杂程度上。简单工厂模式是由工厂类按用户条件直接生产相应的业务对象;而抽象工厂类则只定义相关获取业务对象的抽象方法,具体实现延迟到其子类体实现。当创建对象的方法变得复杂了,可将工厂类变成抽象类。
    图2就是一个简单工厂的例子,ComputerFactory按用户的要求生成相应的计算机;图3是一个抽象工厂的例子,抽象工厂AbstractFactory只声明了生成CPU和RAM的抽象方法,具体如何实现,则由指定的厂商按自己的规范生成。



      

    
                         图 2   简单工厂                                             图 3  抽象工厂

3 购物系统设计

    明确了DAO模式和Abstract Factory模式的基本思想,下面以购物车为例,阐明该模式在系统设计中的应用。本文的所有设计在Jdk1.6 + MyEclipse6.1 + Tomcat6.0 + MySql5.0下实现。
本文选取购物车[5]作为阐述例子,是鉴于该类系统:
    (1)业务多样性(图书、服装、电子产品,等等)。
    (2)后台数据库的多样(SqlServer2000、SqlServer2005、MySql、Oracle等等)。
    (3)业务变动频繁(不定期、不定时、不定量的商品促销、打折优惠活动)。
3.1 数据源访问控制

    数据源访问层(DAL) [6]主要处理如何管理其连接资源(如:数据连接池),如何提供不同的数据持久化方法,如何记录与数据源交互的重要信息等,最主要的是异常信息,以方便用户的跟踪维护。
    IDataSource接口定义一些持久化操作必须实现的通用接口规范。所有的用户数据源类均实现该接口,提供各自的具体实现方法。考虑到用户可能提供多种不同的数据源实现方式(即不同的IDataSource的子类),为了让用户灵活的选择所需的数据源实现方式,利用数据源工厂DataSourceFactory根据用户的配置文件config.xml的factory结点的dataSource属性值指定的数据源名称,通过反射机制[7]生成不同的数据源操作对象,返回一个统一接口DataSource。具体数据源操作由哪个子类提供,通过函数工厂屏蔽掉。
    在此提供了一个通用的数据源GeneralDataSource实现简单的持久化操作,用户可以扩展自定义的数据源实现方式,也可以从该类扩展,重载相关实现方法。
    考虑到日后的维护方便,在此设计日志记录类,来记录用户的操作过程或数据库的相关信息。日志文件的实现方式可以根据用户配置文件config.xml利用参数控制。其设计思想如图4所示。

图 4  数据访问层

3.2 业务层DAO的设计

    按照DAO的思想,将业务操作按功能分类,用接口方式规范化。与业务操作方法交互的途径是传递业务信息对象。
    所有具体的数据访问对象均实现相应的业务操作接口。各个数据访问对象接收实体对象,并对其进行操作,对于需要持久化的,调用DataSourceFactory生成相应的数据源操作对象。其各对象的关系如图5所示。
    ICustomerDAO,IOrderDAO等定义规范的业务操作接口;MySqlCustomerDAO,MySql5OrderDAO等是不同的数据库对业务操作的具体实现,若业务有需要持久化操作的,利用DataSourceFactory工厂生成数据源对象;Customer,Order等表示传递给相应业务方法的实体信息对象。



图 5  DAO在系统中的应用

    为了使购物车系统不依赖于单一数据库系统,使其具有方便的迁移性和灵活的扩展性,在此使用抽象工厂模式思想:即定义抽象方法DAOFactory返回数据访问对象接口,根据用户的需要,由该抽象工厂生成一个具体的数据库工厂,由具体的数据库工厂生成所有的数据访问对象。可以通过配置config.xml文件的相关片段,来选择应用哪个数据库。
    如图6所示,将相应的业务操作,分类封装为不同的接口以规范其实现方式,如ICustomerDAO,IOrderDAO等,不同的数据库系统可以根据自己的特点,用各自特有的方式实现各个业务接口。而业务逻辑层(BLL层)则接收用户的输入参数,封装成相应对象,传递给相应的业务方法。

图 6  抽象工厂在系统中的应用

3.3 系统参数配置  

    关于系统参数,为了保证以后方便维护,在设计中参数由配置文件config.xml提供,并设置框架文件config.xsd[8]对其进行验证。对于验证不合格的配置文件,系统参数读取失败,直接抛出ConfigFileFormatException,中止系统的运行,如图7所示。
    本系统的配置文件config.xml主要内容如下:
    <configuration><log><!--有关日志文件的配置参数--></log><factorys><factory name="mysql5" type="test2.shopping.factory.MySql5DAOFactory" datasource="test2.shopping.datasource.GeneralDataSource"><driverclassname>com.mysql.jdbc.Driver</driverclassname><url>jdbc:mysql://localhost:3306/test</url><username>root</username><password>123456</password></factory><!--可以继续配置其它数据库方式--></factorys></configuration>


图 7  系统参数
    以MyEclipse6.1下实现为例,在系统开始运行之前,配置站点的web.xml[9]文件,为其加入全局配置参数,指定配置文件的存放位置,并指定具体使用使配置文件中的哪个数据源:
  <context-param><param-name>configFilePath</param-name><param-value>\config\config.xml</param-value></context-param><context-param><param-name>factoryName</param-name><param-value>mysql5</param-value></context-param>
    其中configFilePath指定配置文件的存放路径,若用户不指定,则默认为本站点根目录下的\config\config.xml文件。
    factoryName参数指定读取配置文件中的哪一个factory片段参数作为与数据源的连接。该参数必须指定,而且名称必须与config.xml中factory的属性name的值一致。
    当系统启动时,读取web.xml中的参数,得到配置文件的路径,再解析配置文件,将相关参数以静态形式存放在类SystemParams中。
4 小结

    通过DAO模式加Abstract Factory模式在业务层设计中的使用,该购物车系统具有两个明显优点:
    1)调用方式简洁,规范
    配置好config.xml配置文件和web.xml文件后,如在CustomerBLL对象中需要取得所有的客户资料,则可按如下方式调用:
    Customer[] custArr  = DAOFactory.getDAOFactory(). getCustomerDAO().getCustomerList();
    2)灵活的扩展性
    (1)根据不同的数据库平台,用户可以提供自己的数据库实现方式(或从原有的数据库实现方式继承实现,只需重载其相应实现方法即可),通过修改配置文件即可完成数据库的迁移。
    (2)若修改了客户的数据表字段内容,则只需要修改Customer与实现了ICustomerDAO的子类,但业务层的调用接口形式不变。
    (3)对于业务的扩展,只需要在业务接口中进行添加方法,修改相关业务类,然后在BLL层调用相应方法。
    (4)若用户提供了自己的数据源实现方式(通过实现IDataSource接口或继承已有的GeneralDataSource而来),修改配置文件config.xml的factory的dataSource属性为该类完整路径即可。
    总之,将DAO模式和Abstract Factory模式用于系统设计中,可提供强大的灵活性。
    3)展望
    在系统设计中,复杂的设计模式并不是系统设计的必须选择。但对于业务逻辑复杂,业务变动频繁的系统,采用DAO模式结合Abstract Factory可以使系统层次分明,并且方便以后的维护升级。目前对于DAO的第三方插件十分丰富(如Hibernate[10]),用户也可直接将其应用于自己的系统。
参考文献

    [1]孙卫琴.精通struts:基于MVC的Java Web设计与开发[M]. 北京:电子工业出版社. 2004:9-10
    [2]Sun corp. Core j2ee patterns[OL]. http://java.sun.com/blueprints/corej2eepatterns/Patterns /DataAccessObject.html.2004
    [3]马树奇,金燕.J2EE1.4编程指南[M]. 北京:电子工业出版社. 2005:568-574      
    [4]孙卫琴.精通Hibernate:Java对象持久化技术详解[M]. 北京:电子工业出版社. 2005:89-102
    [5]薛万欣.电子商务网站建设[M]. 北京:清华大学出版社. 2007:104-129
    [6]孟亚辉,张党进.一种基于ORM理论的DAL设计与实现[C]. 广东:茂名学院学报. 2008,18(4):1-3
    [7]Bruce Eckel. Thinking in Java 4[M]. Prentice Hall PTR .2006:441-459
    [8](美)H.M.Deitel&P.J.Deitel .XML 编程技术大全[M]. 康博[译]. 北京:清华大学出版社. 2002
    [9] 高守传.精通Eclipse Web开发-Java体系结构、工具、框架及整合应用[M]. 北京:人民邮电出版社. 2006:305-612
    [10] 夏昕.深入浅出Hibernate. 出版地不详.2008
    收稿日期:11月10日   修改日期:11月14日

猜你喜欢

转载自macleo.iteye.com/blog/1487115