工厂设计模式和DAO设计模式有什么区别?

4
比较这两种模式 - Factory 和 DAO 模式,我发现它们非常相似:
它们都有接口(Product/Dao),工厂(ProductFactory/DaoFactory)和具体实现(ConcreteProduct、ConcreteDao)。
工厂创建一些具体实现对象,客户端通过接口使用该对象。
那么它们是相似的还是我理解有问题?或者 DAO 模式是工厂模式的一个具体实现吗?
提前感谢。

1
可能是什么是DAO工厂模式?的重复问题。 - Armfoot
1
DAO通常是对某种类型的数据库/后端的抽象。其思想是您可以处理数据而不必关心后端的特定实现(SQL Server、NoSQL等)。工厂甚至更加抽象。它为某种现象提供了一些实现,您可以将其推迟到工厂来确定应该是什么。 - lintmouse
4个回答

2
DAO 模式将应用程序中的持久化细节抽象出来。域逻辑不直接与数据库、文件系统、Web 服务或任何其他持久化机制通信,而是与 DAO 层通信。这个 DAO 层然后再与底层的持久化系统或服务通信。 DAO 层的优点在于,如果您需要更改底层的持久化机制,只需更改 DAO 层,而不是从使用 DAO 层的所有域逻辑的所有位置进行更改。
查看 此文章 以获得更好的理解。
工厂模式中,我们创建对象而不向客户端公开创建逻辑,并使用通用接口引用新创建的对象。

客户端需要一个产品,但是它不是直接使用 new 运算符创建它,而是请求工厂对象提供一个新产品,并提供有关所需对象类型的信息。

工厂实例化一个新的具体产品,然后返回给客户端新创建的产品(强制转换为抽象产品类)。

客户端使用产品作为抽象产品,而不知道它们的具体实现。 阅读此文章以获得更好的理解。 工厂模式讨论对象的创建,DAO 模式讨论数据管理。

1
我假设当你提到DAO模式时,你想到的是这样的内容:

enter image description here

来源

然而,DAO并不一定需要工厂来创建。例如,在Spring上下文中,RepositoriesDAOs之间没有区别,客户端也没有Repository工厂。

引用Oracle文章中的话,图表实际上是使用了GoF工厂模式(在四人帮书中有两种:抽象工厂和工厂方法):

The DAO pattern can be made highly flexible by adopting the Abstract Factory [GoF] 
and the Factory Method [GoF] patterns (see "Related Patterns" in this chapter).

总之,两种模式在用例(如果不是结构)上存在明显的区别,并且DAO模式中的工厂可能指的是“真正”的工厂模式,它作为附加优势而添加,而不是该模式的组成部分。

1

我觉得它们非常不同。

DAO用于在序列化(通常是SQL)版本的数据和Java对象之间进行转换。

另一方面,工厂可用于促进通用解决方案,用于解决大部分工作相似的问题。我曾经创建过一个SocketHandlerFactory的示例,用于由通用ServerSocket使用,以便无论如何处理生成的Socket,您都可以在工厂中进行配置。

这能帮助你理解吗?


谢谢您的时间。您的意思是它们在使用领域上有所不同(DataSources 和 SocketHandler),但我认为它们在结构和使用方式上相似(接口、工厂、实现)。 - Pavel_K
当然,我同意这个想法。两者的想法都是尽可能地封装大量的管道,并使其余部分成为模块化的。 - ControlAltDel

0

主要的区别在于这些设计模式所使用的语义上下文。

DAO 用于抽象化数据库处理的领域逻辑。

Factory 用于抽象化对象创建逻辑。

不必担心实现/接口细节。

将应用程序分成层,如果需要数据库,则拥有 DAO 是一种选项,可以跨层使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接