注意:问题在帖子的末尾。
我已经阅读了其他关于抽象工厂与工厂方法的堆栈溢出线程。我理解每个模式的意图。然而,我并不清楚它的定义。
工厂方法定义了一个用于创建对象的接口,但让子类决定实例化哪些子类。工厂方法让类将实例化推迟到子类。
相反,抽象工厂提供了一个接口,用于创建相关或依赖对象族,而无需指定它们的具体类。
抽象工厂看起来与工厂方法非常相似。我画了几个UML类来说明我的观点。
注意:
工厂方法:
抽象工厂(仅1个成员):
抽象工厂(更多成员):
问题:
发布于 2010-11-18 11:03:52
希望这能有所帮助。它描述了各种类型的工厂。我用Head First Design Patterns这本书作为我的参考。我使用yuml.me来绘制图表。
静态工厂
是一个具有静态方法的类,用于生成Product的各种子类型。
简单工厂
是一个可以产生不同子类型的Product的类。(它比静态工厂更好。添加新类型时,不需要更改基类Product,只需更改简单工厂类)
工厂方法
包含一种方法,用于生产与其类型相关的一种类型的产品。(它比简单的Factory更好,因为类型被推迟到一个子类。)
抽象工厂
生成相关的类型族。它与Factory方法有很大的不同,因为它生成的类型方法不止一种。(这很复杂,请参考下一个图表,以获得更好的现实生活示例)。
.NET框架中的示例
DbFactoriesProvider是一个简单的工厂,因为它没有子类型。DbFactoryProvider是一个抽象工厂,因为它可以创建各种相关的数据库对象,如连接和命令对象。
发布于 2010-11-18 07:11:29
这两种模式肯定是相关的!
模式之间的区别通常在于意图。
工厂方法的intent是“定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法允许类将实例化推迟到子类。”
抽象工厂的intent是“提供一个接口,用于创建相关或依赖对象族,而无需指定它们的具体类”。
纯粹基于这些意图声明(引用自GoF),我想说工厂方法在某种意义上确实是一个“退化的”抽象工厂。
它们通常在实现上有所不同,因为工厂方法比抽象工厂简单得多。
然而,它们在实现中也是相关的。正如GoF一书中所提到的,
AbstractFactory仅声明了一个用于创建产品的接口。这取决于ConcreteProduct子类来实际创建它们。最常见的方法是为每个产品定义一个工厂方法。
这篇c2 wiki在这个话题上也有一些有趣的讨论。
发布于 2016-07-30 06:17:02
看起来OP的(优秀的)问题列表被忽略了。目前的答案只是提供了重新计算的定义。因此,我将尝试简明扼要地解决最初的问题。
不是的。抽象工厂必须创建多个产品才能形成一个“相关产品系列”。规范的GoF示例创建了ScrollBar()
和Window()
。这样做的好处(和目的)是抽象工厂可以在其多个产品中强制执行一个共同的主题。
首先,我们必须注意,当GoF写书的时候,Java和C#都还不存在。术语接口在GoF中的使用与特定语言引入的接口类型无关。因此,可以从任何API创建具体的创建者。模式中的要点是API使用它自己的Factory方法,因此只有一个方法的接口不能是Factory方法,就像它不能是Abstract Factory一样。
按照上面的答案,这个问题不再有效;但是,如果您认为Abstract Factory和Factory方法之间的唯一区别是创建的产品数量,请考虑客户端如何使用这些模式。抽象工厂通常被注入到它的客户端,并通过组合/委托调用。必须继承Factory方法。因此,这一切都回到了旧的组合与继承的争论中。
但是这些答案提出了第四个问题!
如果该方法是静态的,则通常将其称为静态工厂。如果该方法是非静态的,则通常将其称为简单工厂。这两种模式都不是GoF模式,但在实践中它们更常用!
https://stackoverflow.com/questions/4209791
复制相似问题