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

意:问题在帖子末尾。


我已经阅读了有关Abstract Factory vs Factory Method的其他stackoverflow线程。我了解每种模式的意图。但是,我对该定义不清楚。


Factory Method定义了一个用于创建对象的接口,但是让子类决定要实例化的对象。工厂方法允许类将实例化延迟到子类。


相比之下,抽象工厂提供了一个接口,用于创建相关或相关对象的族,而无需指定其具体类。


- 约翰·费米内拉


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


注意:


该图来自www.yuml.com,因此它们的方向不完全正确。但它是免费的服务:)。

这些图可能并不完美。我仍在学习GoF设计模式。

工厂方法:

http://img.mukewang.com/5d96f1c40001abf302910616.jpg

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

http://img3.mukewang.com/5d96f1c700013ffa03550616.jpg

抽象工厂(更多成员):

http://img1.mukewang.com/5d96f1cc0001f95706240616.jpg

问题:


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

可以从接口创建Factory Method具体创建器,还是必须从类创建它?(类将实例化延迟到子类)

如果抽象工厂只能有一个创建者和一个产品,那么抽象工厂和工厂方法之间的唯一区别是前者的创建者是一个接口,后者的创建者是一个类吗?


SMILET
浏览 652回答 3
3回答

翻翻过去那场雪

看来,OP的(优秀)问题列表已被忽略。当前的答案仅提供了经过重新定义的定义。因此,我将尝试简洁地解决原始问题。如果抽象工厂只有一个创建者和一个产品,那么它仍然是抽象工厂模式吗?(用于创建家族的界面)没有。抽象工厂必须创建多个产品才能制作“相关产品系列”。规范的GoF示例创建ScrollBar()和Window()。优点(和目的)是,抽象工厂可以在其多个产品中强制使用一个公共主题。可以从接口创建Factory Method具体创建器,还是必须从类创建它?(类将实例化延迟到子类)首先,我们必须注意,GoF编写本书时既没有Java也没有C#。术语接口的GoF使用与特定语言引入的接口类型无关。因此,可以从任何API创建具体的创建者。模式中的重点是API使用了自己的Factory方法,因此只有一个方法的接口不能是Factory方法,而只能是Abstract Factory。如果抽象工厂只能有一个创建者和一个产品,那么抽象工厂和 工厂方法之间的唯一区别是前者的创建者是一个接口,后者的创建者是一个类吗?按照上述答案,该问题不再有效;但是,如果您认为抽象工厂和工厂方法之间的唯一区别是创建的产品数量,请考虑客户如何使用这些模式中的每一个。通常将抽象工厂注入其客户端,并通过组合/委托进行调用。工厂方法必须被继承。因此,一切都回到了旧的组合与继承之争。但是这些答案提出了第四个问题!由于只有一个方法的接口不能是工厂方法,而只能是抽象工厂,所以我们怎么称呼只有一个方法的创建接口?如果该方法是静态的,则通常称为“ 静态工厂”。如果该方法是非静态的,则通常称为简单工厂。这些都不是GoF模式,但是在实践中它们更常用!
打开App,查看更多内容
随时随地看视频慕课网APP