为什么抽象工厂处理家庭,而工厂方法处理生成单个对象?
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
开始,可能会演变成其他创作模式,如 AbstractFactory
、Prototype
或 Builder
我也同意@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 以更好地理解这些模式。
根据我的阅读,抽象工厂模式通常关注于创建多个对象,这些对象都与同一个系列相关联,而工厂方法模式关注于生成单个对象。
考虑下面的例子,它颠覆了这些担忧:
// 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
开始,可能会演变成其他创作模式,如 AbstractFactory
、Prototype
或 Builder
我也同意@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 以更好地理解这些模式。