`
harrison2010
  • 浏览: 105719 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

有必要使用dao时候使用工厂模式和接口吗?

阅读更多
先说明下是怎么使用dao的接口和工厂模式的(甚至包含抽象工厂模式)
1.当我们建立一个系统的时候,我们并不知道将要要用到什么样子的数据库,而且有可能随着
变化我们用到的数据库也有可能就被别的好的数据库代替。这个是使用dao接口及抽象工厂模式的前提
2.比如我们有一个user对象,我么对其操作要建立uerdao,我们仅仅知道对其操作,但是具体的做要要在数据库里面实现,不同的数据库操作不要一样,因此我们分成多种dao。但是这些别的人员并不一定要知道,别人用的是dao,没有必要去知道我用什么数据库来操作。因此uerDAo是个接口
诞生了userMySQLDAO,userOracleDAO等等。有了这些以后,使用者仅仅用个到userDAo的方法就可以
但是新的问题又出现了
3.userdao是一个接口我怎么去使用,我不能new我怎么使用
于是就出来了factory工厂可以魏你建立一个你自己想要的DAO就可以了。factory.getUserMySQLDAO。如果factory是一个一般的类,那么我们必须知道是什么样子的工厂,是mysql的工厂还是oracle的 工厂。
因此要使用抽象工厂模式



辩论:
这样好吗?
这样的factory每次都在用new来创建对象。会不会造成资源的浪费那?
为什么我们不能用一个静态的办法来代替那?
比如我仅仅定义一个userdao的类
分享到:
评论
17 楼 Joo 2008-08-04  
暂且先不要谈Spring IOC,就楼主的本意来谈谈到底应该不应该使用抽象工厂吧
我们老大也让我给做一个通用的IDAO出来以应付多个数据源切换的要求,虽然说一般情况下一个项目更换数据源的可能性非常小,但是这么做的目的其实是为了统一DAO操作接口,更重要的目的是为了在DAO层面上事先不同数据源的事务管理

16 楼 H_eaven 2008-08-04  
切换数据库不仅仅是运行起来的程序今天用MySql明天用Oracle.
还要保证你的程序对A用户可以用MySql,对于B用户可以用Oracle.
如果开发的程序只有一个人用,也没多少地方天天换.
15 楼 cyberblue 2008-07-09  
企业开发一般都用DataSource,根本不需要Class.forName()什么的。

如果用DAO也是封装到EJB里,要换DAO的话换个JNDI就可以了。

用了Hibernate或OpenJPA之后,如果设计得当的话,数据库之间的差异可以忽略不计。
14 楼 bloodrate 2008-07-09  
在实际的项目应用中,数据库的移植是不常见的,基本上没有见过。 如果出现数据库移植,程序的改动是相当大的,不是简单的改变下factory的调用就能完成的。
这种抽象工厂的做法只是作为一种技术存在在spring这种框架中。
性能这方面,没有具体研究不好说。[/quot

数据库是可移植也取决于持久层接口的设计好坏,比如如果Dao有,find(String sql)这样的方法,显然是破坏移植性的,因为开发人员完全有可能传进去一个只有oracle才能执行得语句。。所以除了考虑factory以外,注意接口的设计
13 楼 bloodrate 2008-07-09  
neptune 写道
用spring的ioc都解决于,不用自已想什么DaoFactory


我觉得就算依赖注入也是注入的DaoFactory,没听过注入Dao的,IOC可以说是工厂模式精华体现,但是和传统工厂有本质区别。

工厂一般有两个作用:对对象得创建过程步骤进行统一管理;对对象的创建种类进行统一管理。
我有一次用第三方的邮件开发包连接该公司得邮件服务器,起先没有用工厂,没什么问题正常,可是到后来需要做灾难备份,一台邮件服务器宕机了,使用另外一台,我也没太在意,因为我觉得这个是邮件服务器自带得功能,当右键负责人说这个功能需服务器不提供要我手动完成得时候我抓狂了,因为我需要在每个使用邮件开发包的类的地方加入“如果链接这个邮件服务器失败,则链接另一个”,好一通找。赶紧封装到工厂里。。对于外来得,自己并不熟悉得开发包,使用工厂等价于给自己对这个包可能得任何不理解得地方的空间。

IOC提出的前提,Martin Folwer是这样阐述得,IOC是为了构建web层的可插拔组件而提出得,因为众所周知,人人都想把软件做成零件拼装得形式,可是web项目出于“环境依赖性强”得特点,构件可插拔性弱,IOC致力于解决这个矛盾。

一般工厂和IOC是可以同时使用得。

以上我的见解
12 楼 bloodrate 2008-06-11  
coolfiry 写道
Spring的IOC并不能说解决了不用自己想DaoFactory。设计模式的什么时候都是有用的。

这里我认为还是有必要用抽象工厂的,因为我可以是注入工厂,这样可以更好。
注入不同的工厂就会产生不同的dao对象了。


到底是使用静态工厂还是抽象工厂好呢?“注入不同的工厂就会产生不同的dao对象了”意思是说每个工厂负责产生一种dao,那么为什么不用一个工厂类得各个方法来产生不同dao呢?
11 楼 daquan198163 2008-06-10  
eivenchan 写道
引用
有多少机会需要不停的更换数据库,如果不更换数据库,这个接口还有存在的必要吗!

我觉得有存在的必要,不说系统架构那么高级别的东西,
单是说单元测试就有必要,直接用具体类不能mock,也就不能unit test.

可以的,至少easymock最新版本已经可以了
另外dao单元测试意义不大,最好直接做集成测试,敏捷版讨论过
10 楼 eivenchan 2008-06-10  
引用
有多少机会需要不停的更换数据库,如果不更换数据库,这个接口还有存在的必要吗!

我觉得有存在的必要,不说系统架构那么高级别的东西,
单是说单元测试就有必要,直接用具体类不能mock,也就不能unit test.
9 楼 kjj 2008-06-07  
有多少机会需要不停的更换数据库,如果不更换数据库,这个接口还有存在的必要吗!
8 楼 gnomewarlock 2008-06-06  
我感觉用还是用工厂+OBJECTCACHE的方式比较好,如果不用SPRING的话。
7 楼 coolfiry 2008-04-12  
Spring的IOC并不能说解决了不用自己想DaoFactory。设计模式的什么时候都是有用的。

这里我认为还是有必要用抽象工厂的,因为我可以是注入工厂,这样可以更好。
注入不同的工厂就会产生不同的dao对象了。
6 楼 raykcn 2008-03-08  
这8算月经帖?
5 楼 foy 2008-03-08  
skydream 写道
neptune 写道
用spring的ioc都解决于,不用自已想什么DaoFactory


呵呵,很好的办法,定义接口,代码中针对接口编程,然后用spring将真正的实现注入。

如果实现修改了,只要简单的修改spring的配置文件就搞定。

恩啊,spring IOC很好很强大
4 楼 77tt77 2008-02-19  
是啊

SPRING的IOC的优势就在这里体现了!!

反向控制,或者叫做依赖注入!
3 楼 skydream 2008-02-19  
neptune 写道
用spring的ioc都解决于,不用自已想什么DaoFactory


呵呵,很好的办法,定义接口,代码中针对接口编程,然后用spring将真正的实现注入。

如果实现修改了,只要简单的修改spring的配置文件就搞定。
2 楼 neptune 2008-02-19  
用spring的ioc都解决于,不用自已想什么DaoFactory
1 楼 zzxplayful 2008-02-18  
如果你的Dao工厂使用很频繁,你可以使用对象池来处理啊,或者单态也可以阿

相关推荐

Global site tag (gtag.js) - Google Analytics