我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到。
从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但对客户隐藏实现,因为他们将看到通用产品。我的第一个问题是关于抽象工厂的。它的作用是允许您在其中创建具体对象系列(这可能取决于您使用的特定工厂),而不仅仅是单个具体对象?抽象工厂是否只返回一个非常大的对象或许多对象,具体取决于您调用的方法?
我的最后两个问题是关于一个我无法完全理解的单引号,我在很多地方都看到过:
两者之间的一个区别在于,对于抽象工厂模式,一个类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式使用继承并依赖子类来处理所需的对象实例化。
我的理解是工厂方法模式有一个 Creator 接口,这将使 ConcreteCreator 负责知道要实例化哪个 ConcreteProduct。这就是使用继承来处理对象实例化的意思吗?
现在关于那句话,抽象工厂模式究竟是如何通过组合将对象实例化的责任委托给另一个对象的?这是什么意思?看起来抽象工厂模式在我看来也使用继承来完成构造过程,但是我仍然在学习这些模式。
任何帮助,尤其是最后一个问题,将不胜感激。
“工厂方法”和“抽象工厂”的主要区别在于工厂方法是方法,而抽象工厂是对象。我想很多人会混淆这两个术语,并开始互换使用它们。我记得当我学习它们时,我很难找到确切的区别。
因为工厂方法只是一个方法,它可以在子类中被覆盖,因此你引用的后半部分:
…工厂方法模式使用继承并依赖子类来处理所需的对象实例化。
引用假定一个对象在这里调用 它自己的 工厂方法。因此,唯一可以改变返回值的就是子类。
抽象工厂是一个拥有多个工厂方法的对象。看看你报价的前半部分:
…使用抽象工厂模式,一个类通过组合将对象实例化的责任委托给另一个对象…
他们说的是有一个对象 A,他想制作一个 Foo 对象。与其创建 Foo 对象本身(例如,使用工厂方法),不如使用 不同 的对象(抽象工厂)来创建 Foo 对象。
为了向您展示差异,这里是使用的工厂方法:
class A { public void doSomething() { Foo f = makeFoo(); f.whatever(); } protected Foo makeFoo() { return new RegularFoo(); } } class B extends A { protected Foo makeFoo() { //subclass is overriding the factory method //to return something different return new SpecialFoo(); } }
这是一个正在使用的抽象工厂:
class A { private Factory factory; public A(Factory factory) { this.factory = factory; } public void doSomething() { //The concrete class of "f" depends on the concrete class //of the factory passed into the constructor. If you provide a //different factory, you get a different Foo object. Foo f = factory.makeFoo(); f.whatever(); } } interface Factory { Foo makeFoo(); Bar makeBar(); Aycufcn makeAmbiguousYetCommonlyUsedFakeClassName(); } //need to make concrete factories that implement the "Factory" interface here