为什么Abstract Factory处理族,而Factory Method生成单个对象?

时间:2016-07-29 14:37:58

标签: design-patterns abstract-factory factory-method

根据我的阅读,抽象工厂模式通常涉及创建几个与同一族相关联的对象,而工厂方法模式与生成单个对象有关。

请考虑以下示例,它会翻转这些问题:

// 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方法是创建单个对象的更好方法?

2 个答案:

答案 0 :(得分:2)

在给定的示例中,BasePizzaCreator是一个抽象工厂,但IPizzaFactory不是任何GoF设计模式(尽管它有时被称为简单工厂)。

至于为什么抽象工厂处理产品系列,而工厂方法处理单一产品:这就是GoF如何定义它们。 GoF书提到实现抽象工厂最常见的方法是使用多种工厂方法;但我在实践中没有看到这一点。从客户端的角度来看,抽象工厂可能更受欢迎,因为客户端通过组合/委托调用它,而不是要求客户端继承该方法的工厂方法。

最后,请注意"抽象工厂与工厂方法" 是Stack Overflow上第二大最受欢迎的设计模式主题。不幸的是,还有很多(高度投票的)错误信息发布,所以如果有疑问,请继续参考本书。

答案 1 :(得分:1)

这就是这两种模式的意图差异。

FactoryMethod:定义用于创建对象的接口,但让子类决定实例化哪个类。 FactoryMethod允许类将实例化推迟到子类。

AbstractFactory:提供一个界面,用于创建相关或从属对象的族,而无需指定其具体类。

AbstractFactory类通常使用FactoryMethods实现,但即使使用Prototypes

也可以实现它们

一般来说,设计始于FactoryMethod,可能会转向其他创作模式,例如AbstractFactoryPrototypeBuilder

我同意@ jaco0646关于使用AbstractFactory(使用委托/组合)而不是使用FactoryMethod(基于继承)的优势

关于您的上一次查询:

  

为什么Abstract Factory是创建相关对象族的更好方法,而Factory方法是创建单个对象的更好方法?

是。两者都意味着在意图中引用的不同目的。

AbstractFactory具有从一个系列中返回其中一个产品的优势。

FactoryMethod的优点:它可以多次返回同一个实例,或者可以返回一个子类而不是那个确切类型的对象。

请参阅此sourcemaking链接以更好地了解这些模式。