在下面的示例中,使用Abstract Factory而不是factory方法的真正好处是什么?

TheItalianJobless:

在写问题之前,我阅读了以下参考资料:

  1. 工厂方法与抽象工厂
  2. 抽象工厂与工厂方法(范围)
  3. 抽象工厂,工厂方法,生成器
  4. 工厂,抽象工厂和工厂方法
  5. 抽象工厂模式与工厂方法之间的差异

我看到许多像我一样的人难以“抓住”抽象工厂和工厂模式之间的具体差异。我对设计模式不熟悉,我遇到了这个示例http://www.oracle.com/technetwork/java/dataaccessobject-138824.html,并且我正在尝试加深主题。

通过比较,我发现对于3个DTO,我们有:

1)抽象工厂

  • 1个抽象类(带有3个抽象方法和3个切换用例);
  • 3种持久性类型的工厂类(每种都有3种获取DTO DAO的方法)
  • 3个接口和9个DAO。

2)工厂方法:

  • 3个工厂类,每个接口一个(每个带有3个开关箱);
  • 可能我可以创建3个超类,从中扩展DAO类以不重复代码,例如用于连接数据库的代码。
  • 3个接口和9个DAO。

从代码量的角度来看,我看不出任何实质性的区别。如果您需要添加新的持久性支持或新的接口/ DTO,则差异是最小的(并且是互补的)。

从客户的角度来看:

1)抽象工厂:

public static final int PERSISTENCE_TYPE = DAOFactory.ORACLE;

DAOFactory daoFactory = DAOFactory.getDAOFactory(PERSISTENCE_TYPE);

CustomerDAO cDAO = daoFactory.getCustomerDAO();
AccountDAO aDAO = daoFactory.getAccountDAO();
OrderDAO oDAO = daoFactory.getOrderDAO();

2)工厂方法:

public static final int PERSISTENCE_TYPE = DAOFactory.ORACLE;

CustomerDAO cDAO = CustomerDAOFactory.getCustomerDAO(PERSISTENCE_TYPE);
AccountDAO aDAO = AccountDAOFactory.getAccountDAO(PERSISTENCE_TYPE);
OrderDAO oDAO = OrderDAOFactory.getOrderDAO(PERSISTENCE_TYPE);

使用有关持久性类型的DAOFactory并返回与该支持有关的所有DAO而不是为每个DTO使用多个DAOFactory以获得所使用的持久性类型的DAO是否有优势?

现在,我只看到使用抽象工厂的美学概念差异,是否还有我对软件设计的无知无法掌握的实用程序利益?

nairavs:

以前的笔记的一个注释您可以阅读Efecrive Java 2nd Edition中的工厂方法。但是要想想模式之间在现实世界中的差异,请参见:例如

想象一下,您正在盖房子,然后接近木匠的窗户。您提出您的要求,他将构建一个窗口。在这种情况下,木匠是窗户的工厂。您的规格是工厂的输入,窗口是工厂的输出。

抽象工厂

现在,考虑该窗口的相同示例。您可以去木匠那里,也可以去窗户商店或PVC商店。他们都是窗户工厂。根据情况,您可以确定需要处理的工厂类型。

因此,结论-这取决于您要解决的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在下面的示例中不能使用结构的常量属性

使用的目的是什么?和:在下面的代码中

在下面的示例中,为什么int(a)是表达式,而int(unsigned(a))是type-id?

为什么在下面的示例中我无法清除interval?

为什么 Kotlin 的 generateSequence 在下面的示例中返回了太多项?

什么是嵌套循环以及如何在下面的示例中使用它?

在ARKit和RealityKit中使用Raycast的真正好处是什么?

在下面的示例代码中,如何将函数输出显示为列表[a],而不是字符串,显示[a]

“ {}”在下面的功能中是什么意思?

get_rect() 在下面的程序中做了什么?为什么使用它?

为什么在下面的第一个示例和第二个示例中,VS2013为什么分别使用非虚拟和虚拟调用?

为什么在下面的Go代码中不能使用空白标识符?

在下面的代码中,哪种使用Application.Run()的方法是更好的做法?

什么是 !!在下面的宏中做什么?

在下面的代码中,为什么会提示“OUCH”?

为什么我在下面的函数中得到unboundLocalError?

_name_estimators 在下面的代码中做了什么?

在下面的证明中,tactic destruct 有什么作用?

在下面的代码中使用toString()方法的目的是什么?

我在下面的程序中使用angularjs在php上工作,我没有从ajax call获得任何响应。我没有在下面的代码中得到什么错了

ExpandoObject的真正好处是什么?

什么是“ =!” 在下面的PHP代码中是什么意思?

在下面的死锁方案中编写的代码类型是什么?

“角度%= 2 * math.pi;”的目的是什么?在下面的代码中?

在下面的C程序中_AX = 1000是什么意思?

是什么导致程序在下面的代码片段中崩溃?

O("info") 在下面的 javascript 代码中是什么意思?

为什么在下面的代码中printf()打印0而不是10?

为什么在下面的函数中递增数组“ a”不是错误?