首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >设计模式:抽象工厂与工厂方法

设计模式:抽象工厂与工厂方法
EN

Stack Overflow用户
提问于 2010-11-18 06:25:08
回答 10查看 65.3K关注 0票数 144

注意:问题在帖子的末尾。

我已经阅读了其他关于抽象工厂与工厂方法的堆栈溢出线程。我理解每个模式的意图。然而,我并不清楚它的定义。

工厂方法定义了一个用于创建对象的接口,但让子类决定实例化哪些子类。工厂方法让类将实例化推迟到子类。

相反,抽象工厂提供了一个接口,用于创建相关或依赖对象族,而无需指定它们的具体类。

-John Feminella

抽象工厂看起来与工厂方法非常相似。我画了几个UML类来说明我的观点。

注意:

  • 这张图来自www.yuml.com,所以它们没有完全定向。但这是一项免费的服务:)。
  • 图表可能并不完美。我还在学习GoF设计模式。

工厂方法:

抽象工厂(仅1个成员):

抽象工厂(更多成员):

问题:

  1. 如果抽象工厂只有一个创建者和一个产品,它仍然是抽象工厂模式吗?(用于创建族的接口)
  2. 工厂方法具体创建器可以从接口创建,还是必须从类创建?(类将实例化推迟到subclasses)
  3. If抽象工厂只能有一个创建者和一个产品,这是抽象工厂工厂方法之间的唯一区别,前者的创建者是接口,后者的创建者是类?
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-11-18 11:03:52

希望这能有所帮助。它描述了各种类型的工厂。我用Head First Design Patterns这本书作为我的参考。我使用yuml.me来绘制图表。

静态工厂

是一个具有静态方法的类,用于生成Product的各种子类型。

简单工厂

是一个可以产生不同子类型的Product的类。(它比静态工厂更好。添加新类型时,不需要更改基类Product,只需更改简单工厂类)

工厂方法

包含一种方法,用于生产与其类型相关的一种类型的产品。(它比简单的Factory更好,因为类型被推迟到一个子类。)

抽象工厂

生成相关的类型族。它与Factory方法有很大的不同,因为它生成的类型方法不止一种。(这很复杂,请参考下一个图表,以获得更好的现实生活示例)。

.NET框架中的示例

DbFactoriesProvider是一个简单的工厂,因为它没有子类型。DbFactoryProvider是一个抽象工厂,因为它可以创建各种相关的数据库对象,如连接和命令对象。

​​​

票数 134
EN

Stack Overflow用户

发布于 2010-11-18 07:11:29

这两种模式肯定是相关的!

模式之间的区别通常在于意图。

工厂方法的intent是“定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法允许类将实例化推迟到子类。”

抽象工厂intent是“提供一个接口,用于创建相关或依赖对象族,而无需指定它们的具体类”。

纯粹基于这些意图声明(引用自GoF),我想说工厂方法在某种意义上确实是一个“退化的”抽象工厂

它们通常在实现上有所不同,因为工厂方法抽象工厂简单得多。

然而,它们在实现中也是相关的。正如GoF一书中所提到的,

AbstractFactory仅声明了一个用于创建产品的接口。这取决于ConcreteProduct子类来实际创建它们。最常见的方法是为每个产品定义一个工厂方法。

这篇c2 wiki在这个话题上也有一些有趣的讨论。

票数 82
EN

Stack Overflow用户

发布于 2016-07-30 06:17:02

看起来OP的(优秀的)问题列表被忽略了。目前的答案只是提供了重新计算的定义。因此,我将尝试简明扼要地解决最初的问题。

  1. 如果抽象工厂只有一个创建者和一个产品,它仍然是抽象工厂模式吗?(用于创建族的界面)

不是的。抽象工厂必须创建多个产品才能形成一个“相关产品系列”。规范的GoF示例创建了ScrollBar()Window()。这样做的好处(和目的)是抽象工厂可以在其多个产品中强制执行一个共同的主题。

  1. 工厂方法混凝土创建器可以从接口创建,还是必须从类创建?(类将实例化推迟到子类)

首先,我们必须注意,当GoF写书的时候,Java和C#都还不存在。术语接口在GoF中的使用与特定语言引入的接口类型无关。因此,可以从任何API创建具体的创建者。模式中的要点是API使用它自己的Factory方法,因此只有一个方法的接口不能是Factory方法,就像它不能是Abstract Factory一样。

  1. 如果抽象工厂只能有一个创建者和一个产品,则抽象工厂工厂方法的唯一区别在于前者的创建者是接口,而后者的创建者是类?

按照上面的答案,这个问题不再有效;但是,如果您认为Abstract Factory和Factory方法之间的唯一区别是创建的产品数量,请考虑客户端如何使用这些模式。抽象工厂通常被注入到它的客户端,并通过组合/委托调用。必须继承Factory方法。因此,这一切都回到了旧的组合与继承的争论中。

但是这些答案提出了第四个问题!

  1. 既然只有一个方法的接口不能是工厂方法,就像它不能是抽象工厂__一样,我们把只有一个方法的创建性接口称为什么?

如果该方法是静态的,则通常将其称为静态工厂。如果该方法是非静态的,则通常将其称为简单工厂。这两种模式都不是GoF模式,但在实践中它们更常用!

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4209791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档