根据我的阅读,抽象工厂模式通常涉及创建几个与同一族相关联的对象,而工厂方法模式与生成单个对象有关。
请考虑以下示例,它会翻转这些问题:
// Factory Method (base class) allowing for creation of families of objects
public class BasePizzaCreator{
abstract ISauce CreateSauce();
abstract IToppings CreateToppings();
abstract ICrust CreateCrust();
}
// Abstract Factory (interface) defining contract to create a single object
public interface IPizzaFactory{
abstract IPizza CreatePizza();
}
很明显,可以以这种方式使用它们 - 但它是否违反了模式的精神?如果是这样,为什么?
我真正想要理解的是:为什么Abstract Factory是创建相关对象族的更好方法,而Factory方法是创建单个对象的更好方法?
答案 0 :(得分:2)
在给定的示例中,BasePizzaCreator
是一个抽象工厂,但IPizzaFactory
不是任何GoF设计模式(尽管它有时被称为简单工厂)。
至于为什么抽象工厂处理产品系列,而工厂方法处理单一产品:这就是GoF如何定义它们。 GoF书提到实现抽象工厂最常见的方法是使用多种工厂方法;但我在实践中没有看到这一点。从客户端的角度来看,抽象工厂可能更受欢迎,因为客户端通过组合/委托调用它,而不是要求客户端继承该方法的工厂方法。
最后,请注意"抽象工厂与工厂方法" 是Stack Overflow上第二大最受欢迎的设计模式主题。不幸的是,还有很多(高度投票的)错误信息发布,所以如果有疑问,请继续参考本书。
答案 1 :(得分:1)
这就是这两种模式的意图差异。
FactoryMethod
:定义用于创建对象的接口,但让子类决定实例化哪个类。 FactoryMethod
允许类将实例化推迟到子类。
AbstractFactory
:提供一个界面,用于创建相关或从属对象的族,而无需指定其具体类。
AbstractFactory
类通常使用FactoryMethods
实现,但即使使用Prototypes
一般来说,设计始于FactoryMethod
,可能会转向其他创作模式,例如AbstractFactory
,Prototype
或Builder
我同意@ jaco0646关于使用AbstractFactory
(使用委托/组合)而不是使用FactoryMethod
(基于继承)的优势
关于您的上一次查询:
为什么Abstract Factory是创建相关对象族的更好方法,而Factory方法是创建单个对象的更好方法?
是。两者都意味着在意图中引用的不同目的。
AbstractFactory具有从一个系列中返回其中一个产品的优势。
FactoryMethod的优点:它可以多次返回同一个实例,或者可以返回一个子类而不是那个确切类型的对象。
请参阅此sourcemaking链接以更好地了解这些模式。