工厂设计模式和DAO设计模式有啥区别

Posted

技术标签:

【中文标题】工厂设计模式和DAO设计模式有啥区别【英文标题】:What is difference between factory design pattern and DAO design pattern工厂设计模式和DAO设计模式有什么区别 【发布时间】:2015-12-28 15:43:11 【问题描述】:

比较这两种模式 - Factory and DAO 模式,我发现它们非常相似:

它们都有接口(@98​​7654323@)、工厂(ProductFactory/DaoFactory)和具体实现(ConcreteProduct,ConcreteDao)。

Factory 创建一些具体的实现对象,该对象由客户端通过接口使用。

那么它们是相似的还是我不明白的东西?还是道模式是工厂模式的具体实现?

提前致谢。

【问题讨论】:

What is dao factory pattern?的可能重复 DAO 通常是对某种类型的数据库/后端的抽象。这个想法是您可以使用数据而不关心后端的特定实现(SQL Server、NoSQL 等)。工厂就更抽象了。它为一种现象提供了一些实现,你可以按照工厂的要求去做。 【参考方案1】:

数据访问对象 (DAO) 模式抽象出应用程序中持久性的细节。而不是让域逻辑直接与数据库、文件系统、Web 服务或任何其他持久性机制进行通信:域逻辑改为与 DAO 层对话。然后,此 DAO 层与底层持久性系统或服务进行通信。

DAO 层的优势在于,如果您需要更改底层持久性机制,您只需更改 DAO 层,而不是域逻辑中使用 DAO 层的所有位置。

查看this article 以获得更好的理解。

工厂模式中,我们创建对象而不将创建逻辑暴露给客户端,并使用通用接口引用新创建的对象。

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

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

客户在不了解具体实现的情况下将产品用作抽象产品。

阅读此article 以获得更好的理解。

工厂模式谈论对象的创建和DAO模式谈论数据的管理

【讨论】:

【参考方案2】:

IMO 他们完全不同

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

另一方面,Factory 可用于为大部分工作相似的问题提供通用解决方案。我不久前创建的一个示例是 SocketHandlerFactory,供通用 ServerSocket 使用,因此无论生成的 Socket 需要处理,您都可以在 Factory 中进行配置。

这能说明问题吗?

【讨论】:

感谢您的宝贵时间。您的意思是它们在使用领域(DataSources 和 SocketHandler)上是不同的,但我是说它们的结构和使用方式(接口、工厂、实现)是相似的。 当然,我同意这一点。两者的想法是尽可能多地封装管道并使其余部分模块化【参考方案3】:

我假设当您提到 DAO 模式时,您的想法是这样的:

source

但是 DAO 不一定需要工厂来创建它们。例如,在 Spring 上下文中,RepositoriesDAOs 之间没有区别,并且就涉及到客户端而言,没有存储库工厂。

引用 Oracle 文章,该图来自,它们实际上是在使用 GoF 工厂模式(四人帮中有 2 本书;抽象工厂和工厂方法):

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 模式中的工厂可能指的是作为额外好处而不是整体添加的“真实”工厂模式所述模式的一部分。

【讨论】:

【参考方案4】:

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

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

Fatory 用于抽象出对象创建逻辑。

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

将您的应用程序分层,如果您需要数据库,那么,拥有 DAO 是一种选择,可以跨层使用。

【讨论】:

以上是关于工厂设计模式和DAO设计模式有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

工厂模式和策略模式有啥区别?

设计模式重新理解简单工厂模式工厂模式抽象工厂模式

java 抽象工厂模式

设计模式之工厂方法模式

DAO 工厂模式示例

设计模式之简单工厂模式