引用
在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用。
设计模式之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日
分享到:
相关推荐
总结一下,这个项目结合了DAO模式、抽象工厂模式和JavaScript技术,实现了多数据库连接的能力。在后端,通过DAO模式封装数据库操作,抽象工厂模式用于动态创建不同数据库的DAO实例;在前端,可能使用JavaScript进行...
在这个“DAO设计模式(工厂+代理)”的例子中,我们将探讨如何结合工厂模式和代理模式来实现更灵活、更易于维护的DAO层。 首先,让我们理解DAO的基本概念。DAO是一个接口或抽象类,定义了对数据库进行操作的方法,...
工厂模式主要有三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式**:在单一工厂类中根据条件生成不同类型的实例。 2. **工厂方法模式**:定义一个创建对象的接口,让子类决定实例化哪一个...
在Java开发中,DAO模式通常与其他设计模式结合使用,如工厂模式(创建DAO实例)、策略模式(根据策略选择不同的数据访问方式)、单例模式(管理全局唯一的DAO实例)等,以进一步提升系统的灵活性和可维护性。在实际...
C# 抽象工厂 Dao 详解是关于 C# 语言中抽象工厂设计模式的应用,主要用于构建数据访问层(DAL)和业务逻辑层(BLL)的设计。下面将详细解释抽象工厂 Dao 的设计步骤和难点分析。 Step 1: 搭建结构,并建立引用 在...
### 设计模式之抽象工厂详解 在软件工程领域,设计模式是一种被广泛接受的解决方案,用于解决特定类型的问题。...在实际开发中,理解并正确应用抽象工厂模式,能够显著提高代码的复用性和系统的整体性能。
总结来说,DAO模式是企业级应用中不可或缺的设计模式,它简化了数据访问的复杂性,提高了代码的可维护性和可测试性。抽象工厂模式则进一步增强了DAO的灵活性,使得我们可以根据需求选择合适的数据访问策略。理解并...
本系统利用Visual Studio 2005这一强大的开发工具,针对酒店行业的复杂业务需求,巧妙地运用了设计模式中的抽象工厂模式,以实现对不同类型数据库的支持,如SQL Server 2000和Access,从而提供更加灵活的数据存储...
在Java Web开发中,MVC(Model-View-Controller)三层架构和DAO(Data Access Object)工厂模式是两种常见的设计模式,它们对于构建高效、可维护的系统至关重要。本项目结合这两种模式,旨在提高代码组织的清晰度和...
本项目“工厂模式很DAO模式实现购物车”是使用Java语言实现的一个购物车系统,旨在帮助初学者理解并运用这两种设计模式。 首先,我们来看**工厂模式**。工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳...
在J2EE环境中,DAO模式特别有用,因为J2EE应用通常需要处理多种数据持久化机制,如关系数据库、对象数据库、文件系统等。例如,STRUTS框架中的数据持久化可以通过DAO模式来实现,以降低组件间的耦合度,提高代码的可...
在Java编程语言中,工厂模式通常分为简单工厂模式、工厂方法模式和抽象工厂模式三种类型。这些模式都是围绕着一个中心思想:将对象的实例化过程封装起来,使代码更加灵活且易于维护。 1. **简单工厂模式**: 简单...
例如,EJB(Enterprise JavaBeans)中的会话bean和实体bean体现了工厂模式和单例模式,而Hibernate作为流行的ORM(Object-Relational Mapping)框架,其核心机制就是数据访问对象(DAO)模式。 总之,设计模式是...
DAO(数据访问对象)模式是Java项目开发中常见的设计模式,主要用于处理数据库交互,实现业务...在实际项目开发中,结合使用DAO模式和其他设计模式(如工厂模式、策略模式等),可以构建出更加健壮和灵活的系统架构。
**DAO**(Data Access Object)设计模式是一种在Java EE环境中广泛使用的数据访问模式,它主要应用于处理数据存储组件的交互。这种模式的主要目的是将底层数据访问操作与业务逻辑分开,从而简化业务逻辑层的编码工作,...
DAO模式在实际开发中广泛应用,尤其是在Java和.NET等面向对象编程语言中。 ### DAO设计模式的核心概念 1. **数据访问对象(DAO)**:DAO是接口或类,它定义了对数据源进行操作的一系列方法。这些方法通常包括增、...
DAO(Data Access Object)设计模式在构建BBS网站中扮演着至关重要的角色。DAO作为数据访问接口,位于业务逻辑和数据库资源之间,它的主要...在实际开发过程中,应充分理解和运用DAO模式,以提升软件的质量和可维护性。
抽象工厂模式是设计模式中的一种,属于创建型模式,它提供一个创建对象的接口,但允许子类决定实例化哪一个类。这样,抽象工厂就隔离了具体类的生成,使得系统更易于维护和扩展。在登录设计中,抽象工厂可以用来创建...
抽象工厂模式在三层架构中的作用: 抽象工厂模式可以用来创建不同数据库(如SQL SERVER2005)的DAO(数据访问对象)实例,提供一个接口,让业务逻辑层无须关心具体的数据访问方式。例如,你可能有多个数据库供应商...
Java DAO(Data Access Object)设计模式是一种在软件工程中用于数据库...在实际应用中,我们需要根据项目需求选择合适的持久层框架,合理地设计DAO接口和实现,以及妥善处理事务和异常,以保证系统的稳定性和效率。