工厂设计模式和DAO设计模式有啥区别
Posted
技术标签:
【中文标题】工厂设计模式和DAO设计模式有啥区别【英文标题】:What is difference between factory design pattern and DAO design pattern工厂设计模式和DAO设计模式有什么区别 【发布时间】:2015-12-28 15:43:11 【问题描述】:比较这两种模式 - Factory and DAO
模式,我发现它们非常相似:
它们都有接口(@987654323@)、工厂(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 他们完全不同
DAO
s 用于在数据的序列化(通常是 sql)版本和 Java 对象之间进行转换
另一方面,Factory
可用于为大部分工作相似的问题提供通用解决方案。我不久前创建的一个示例是 SocketHandlerFactory,供通用 ServerSocket 使用,因此无论生成的 Socket 需要处理,您都可以在 Factory 中进行配置。
这能说明问题吗?
【讨论】:
感谢您的宝贵时间。您的意思是它们在使用领域(DataSources 和 SocketHandler)上是不同的,但我是说它们的结构和使用方式(接口、工厂、实现)是相似的。 当然,我同意这一点。两者的想法是尽可能多地封装管道并使其余部分模块化【参考方案3】:我假设当您提到 DAO 模式时,您的想法是这样的:
source
但是 DAO 不一定需要工厂来创建它们。例如,在 Spring 上下文中,Repositories
和 DAOs
之间没有区别,并且就涉及到客户端而言,没有存储库工厂。
引用 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设计模式有啥区别的主要内容,如果未能解决你的问题,请参考以下文章