Почему Абстрактная Фабрика имеет дело с семействами, а Фабричный Метод - с генерацией одного объекта?

Из того, что я прочитал, абстрактный шаблон фабрики обычно связан с созданием нескольких объектов, которые все связаны с одним и тем же семейством, а шаблон фабричного метода касается создания одного объекта.

Рассмотрим следующий пример, который отражает эти проблемы:

// 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)

В этом разница в намерениях этих двух моделей.

FactoryMethod Определите интерфейс для создания объекта, но пусть подклассы решают, какой класс создать.FactoryMethod позволяет классу отложить создание экземпляров для подклассов.

AbstractFactoryПредоставить интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.

AbstractFactory классы часто реализуются сFactoryMethods но они могут быть реализованы даже сPrototypes

Вообще дизайн начни сFactoryMethod и может развиваться в направлении других творческих моделей, таких какAbstractFactory, Prototype или жеBuilder

Я тоже согласен с ответом @ jaco0646 относительно преимуществ использованияAbstractFactory (использует делегирование / составление) от клиента вместо использованияFactoryMethod (который основан на наследовании)

Относительно вашего последнего запроса:

Почему Abstract Factory - лучший подход для создания семейств связанных объектов, а метод Factory - лучший подход к созданию единого объекта?

Да. Оба означают для разных целей, как указано в намерении.

AbstractFactory имеет преимущество возврата одного из продуктов из семьи.

Преимущество FactoryMethod: он может возвращать один и тот же экземпляр несколько раз или может возвращать подкласс, а не объект этого точного типа.

Обратитесь к этомуsourcemaking ссылка для лучшего понимания этих шаблонов.

Решение Вопроса

В приведенных примерахBasePizzaCreator абстрактная фабрика, ноIPizzaFactory это не какой-либо шаблон проектирования GoF (хотя его иногда называют простой фабрикой).

Что касается того, почему Абстрактная Фабрика имеет дело с семействами продуктов, тогда как Фабричный Метод имеет дело с одним продуктом: это просто, как их определил GoF. В книге GoF упоминается, что наиболее распространенный способ реализации абстрактной фабрики - это использование нескольких фабричных методов; но я не видел этого на практике. С точки зрения клиента, абстрактная фабрика может быть предпочтительнее, потому что клиенты вызывают ее через композицию / делегирование, а не фабричный метод, который требует, чтобы клиенты наследовали этот метод.

Наконец, обратите внимание, что«Абстрактная фабрика против фабричного метода» является второй по популярности темой шаблонов проектирования в Stack Overflow. К сожалению, есть также много (высоко поднятой) дезинформации, поэтому, если есть сомнения, всегда обращайтесь к книге.

Различия между абстрактным фабричным шаблоном и фабричным методомШаблоны проектирования: абстрактная фабрика против фабричного методаШаблоны проектирования: метод фабрики против фабрики против абстрактной фабрикиФабрика, Абстрактная Фабрика и Фабричный Метод
 jaco064601 авг. 2016 г., 23:08
Это точно верно.
 kodjeff101 авг. 2016 г., 21:58
Спасибо - отличная работа :) - между этим ответом и вашим связанным ответом, я думаю, я понял: как определено GoF, важным преимуществом Abstract Factory является сохранение согласованности между семейством продуктов. И эта выгода является неотъемлемой частью абстрактной фабрики - если вы ее лишите, то теперь вы «что-то другое». Что можно сделать, просто это уже не абстрактная фабрика. Это правильно?
 jaco064601 авг. 2016 г., 17:58
возможномой ответ из второй ссылки выше есть то, что вы ищете.
 kodjeff101 авг. 2016 г., 17:33
Спасибо за ваш ответ. Да, я прочитал много SO-сообщений на эту тему до того, как опубликовал свой вопрос. Я опубликовал этот вопрос особенно, поскольку я не видел, чтобы кто-то обращался к этому аспекту обсуждения в частности. Что касается IPizzaFactory, то он соответствует стандартному определению контракта для абстрактной фабрики (думаю, что мы расширили его, чтобы иметь несколько конкретных реализаций) - с одним поразительным отличием (которое становится основой моего вопроса) - обычно это контракт на Абстрактная фабрика будет определять творческие методы для всего семейства продуктов, а не для одного продукта.

Ваш ответ на вопрос