为什么抽象工厂处理家庭,而工厂方法处理生成单个对象?

Why does Abstract Factory deal with families, and Factory Method with generating a single object?

根据我的阅读,抽象工厂模式通常关注于创建多个对象,这些对象都与同一个系列相关联,而工厂方法模式关注于生成单个对象。

考虑下面的例子,它颠覆了这些担忧:

// 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();
}

很明显,您可以这样使用它们——但这是否违反了模式的精神?如果是,为什么?

我在这里真正想了解的是:为什么抽象工厂是创建相关对象系列的更好方法,而工厂方法是创建单个对象的更好方法?

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

至于为什么抽象工厂处理的是产品系列,而工厂方法处理的是单个产品:GoF 就是这么定义的。 GoF 书提到实现抽象工厂的最常见方法是使用多个工厂方法;但我在实践中没有看到。从客户的角度来看,抽象工厂可能更可取,因为客户通过 composition/delegation 调用它,而不是要求客户继承该方法的工厂方法。

最后,请注意 "Abstract Factory vs. Factory Method" 是 Stack Overflow 上第二受欢迎的设计模式主题。不幸的是,也发布了很多(高度赞成的)错误信息,所以当有疑问时,请始终参考这本书。

  • Differences between Abstract Factory Pattern and Factory Method
  • Design Patterns: Abstract Factory vs Factory Method
  • Design Patterns: Factory vs Factory method vs Abstract Factory
  • Factory, Abstract Factory and Factory Method

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

FactoryMethod : 定义一个创建对象的接口,但是让subclasses决定实例化哪个class。 FactoryMethod 让 class 将实例化延迟到子 classes。

AbstractFactory:提供一个接口,用于创建相关或依赖对象的系列,而无需指定它们的具体 classes。

AbstractFactory classes 通常用 FactoryMethods 实现,但它们甚至可以用 Prototypes

实现

一般设计从 FactoryMethod 开始,可能会演变成其他创作模式,如 AbstractFactoryPrototypeBuilder

我也同意@jaco0646关于从客户端使用AbstractFactory(使用delegation/composition)而不是使用FactoryMethod(基于继承)

的优势的回答

关于您上次的查询:

Why is Abstract Factory the better approach for creating families of related objects, and Factory method the better approach to creating a single object?

是的。正如意图中所引用的那样,两者都意味着不同的目的。

AbstractFactory 具有 returning 系列产品之一的优势。

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

请参阅此 sourcemaking link 以更好地理解这些模式。