Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';工厂方法的s-DAO定义_Java_Hibernate_Design Patterns_Factory - Fatal编程技术网

Java';工厂方法的s-DAO定义

Java';工厂方法的s-DAO定义,java,hibernate,design-patterns,factory,Java,Hibernate,Design Patterns,Factory,多年后,我今天再次阅读了这篇文章,发现了DAO实现的两个定义,第一个使用工厂方法,第二个使用抽象工厂。尽管本文声称第一个示例使用工厂方法,但我开始认为它也可以定义为一个抽象工厂和一个具体工厂实现 工厂方法示例: 抽象工厂示例: 回到GoF,我们可以找到关于为什么它是一个抽象工厂的论点: 抽象工厂创建相关产品的工厂,这将是第一个示例的单个具体实现 抽象工厂用于为不同的外观创建gui工具包工厂,这些工厂将返回不同的组件供其他类处理。这些组成部分密切相关。这些将是具体的dao工厂实现本身,它具有

多年后,我今天再次阅读了这篇文章,发现了DAO实现的两个定义,第一个使用工厂方法,第二个使用抽象工厂。尽管本文声称第一个示例使用工厂方法,但我开始认为它也可以定义为一个抽象工厂和一个具体工厂实现

工厂方法示例:

抽象工厂示例:

回到GoF,我们可以找到关于为什么它是一个抽象工厂的论点:

  • 抽象工厂创建相关产品的工厂,这将是第一个示例的单个具体实现
  • 抽象工厂用于为不同的外观创建gui工具包工厂,这些工厂将返回不同的组件供其他类处理。这些组成部分密切相关。这些将是具体的dao工厂实现本身,它具有创建单个产品/dao的方法
我也看到过很多关于继承(工厂方法)和组合(抽象工厂)之间区别的讨论,但我认为这种区别是非常模糊的。在GoF中,我们了解到使用工厂方法的两种方法之一是
连接并行类层次结构
,这意味着允许创建者以外的类(实现工厂方法的类)调用这些工厂方法

如果某个类使用
创建者导出的接口从另一个类调用工厂方法,这与从
抽象工厂调用方法是一样的。这两个例子都使用继承来从多模态主义中获益,并且都是基于一些抽象的产品界面创建具体的产品。本质上,这意味着相同的UML图可以描述这两种模式

因此,最后,我认为这一切都归结于我是将
DAOFactory
定义为一个具有多个工厂操作的创建者(对于工厂方法),还是一个抽象工厂(对于抽象工厂),在GoF中有以下定义:

创建者(工厂法)

  • 声明工厂方法,该方法返回Product类型的对象。创建者还可以定义 返回默认产品对象的工厂方法
  • 可以调用factory方法来创建产品对象
抽象工厂(抽象工厂)

  • 为创建抽象产品的操作声明接口 物体
进一步阅读,作者甚至似乎认为抽象工厂是一种抽象方法,通过开关案例选择要返回的工厂方法,就像在“工厂工厂”中一样。这一点通过以下摘录变得清晰:

此策略使用工厂中的工厂方法实现 由抽象工厂生产。。。数据访问工厂 对象策略使用工厂方法模式来实现 混凝土工厂及其产品(DAO)。为了增加灵活性 可采用抽象工厂模式,如下文所述 战略

抽象工厂不“生产”工厂。抽象工厂只是描述创建产品的操作的接口。本文接着展示了一个示例代码,其中包含一个抽象方法,该方法在开关盒中创建工厂方法。说抽象工厂生产某些东西对我来说是不对的

因此,要确定模式是工厂方法还是抽象工厂,我需要的不仅仅是UML,还需要应用程序的需求来定义最适合需求描述的模式。所以当我这么做的时候,听起来抽象工厂更适合Oracle的两个例子

首先,因为所有DAO都是紧密耦合的。我可以在DaoFactory内部共享它们之间的相同连接,甚至共享一个事务。第二,因为有多个方法,我从一个集中的对象访问它们。工厂方法本身听起来更像是creator类中的独狼。当你有很多这样的定义时,你就开始更多地进入一个抽象的工厂定义,sorta。尽管GoF有MazeGame定义许多工厂方法的例子,但MazeGame从未被视为工厂。它要么使用许多工厂方法创建迷宫,要么使用抽象工厂

我不认为仅仅因为只有一个实现就调用第一个示例工厂方法就足够了,也不认为仅仅因为生成工厂方法就调用第二个示例抽象工厂


我错过什么了吗?我对这两种模式的看法是最新的还是自GoF以来有所改变?

你的问题不太可能得到明确的答案。您能否提供有关特定应用程序的更多详细信息?听起来您的问题是关于在您的案例中使用哪种模式,但是没有足够的细节。我的问题是关于《J2EE模式》一书对上述两个实现/图表的定义。他们将抽象工厂解释为工厂工厂工厂,将工厂方法解释为充满创建者方法的类。在批评那本书的例子之前,我只是想听听其他人对此的意见。[1]@DaniloSouzaMorães虽然你显然在你的问题上付出了很多努力,但它显然是在邀请主观和基于意见的答案,因此是非常重要的。[2] 也许可以看一看,看看你的问题是否更合适。