Примечание. Вопросы находятся в конце сообщения.
Я прочитал другие потоки stackoverflow, касающиеся абстрактной фабрики и фабричного метода . Я понимаю цель каждого шаблона. Однако мне не совсем понятно определение.
Factory Method определяет интерфейс для создания объекта, но позволяет подклассам решать, какие из них создавать. Заводской метод позволяет классам откладывать создание экземпляров до подклассов.
Напротив, абстрактная фабрика предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.
Abstract Factory выглядит очень похож на метод фабрики . Я нарисовал несколько классов UML, чтобы проиллюстрировать свою точку зрения.
Заметка:
- Диаграмма взята с сайта www.yuml.com, поэтому они не совсем ориентированы. Но это бесплатная услуга :).
- Диаграммы могут быть не идеальными. Я все еще изучаю шаблоны проектирования GoF .
Заводской метод:
Абстрактная фабрика (только 1 участник):
Абстрактная фабрика (больше участников):
Вопросы:
- Если у абстрактной фабрики только один создатель и один продукт, остается ли это паттерн абстрактная фабрика ? (интерфейс для создания семей)
- Может ли конкретный создатель Factory Method быть создан из интерфейса или он должен быть из класса? (классы откладывают экземпляры до подклассов)
- Если у абстрактной фабрики может быть только один создатель и один продукт, является ли единственная разница между абстрактной фабрикой и фабричным методом в том, что создателем первого является интерфейс, а создателем второго - класс?
Ответы:
Надеюсь это поможет. В нем описаны различные типы фабрик. В качестве ссылки я использовал шаблоны проектирования Head First . Я использовал yuml.me для построения диаграммы.
Статическая фабрика
Это класс со статическим методом для создания различных подтипов продукта.
Простая фабрика
Это класс, который может производить различные подтипы Продукта. (Это лучше, чем Static Factory. При добавлении новых типов базовый класс Product не нужно менять, только Simple Factory Class)
Заводской метод
Содержит один метод производства одного типа продукта, связанного с его типом. (Это лучше, чем простая фабрика, потому что тип относится к подклассу.)
Абстрактная фабрика
Создает семейство связанных типов. Он заметно отличается от фабричного метода, поскольку он имеет более одного метода типов, которые он производит. (Это сложно, обратитесь к следующей диаграмме для лучшего примера из реальной жизни).
Пример из .NET Framework
DbFactoriesProvider - это простая фабрика, поскольку у нее нет подтипов. DbFactoryProvider - это абстрактная фабрика, поскольку она может создавать различные связанные объекты базы данных, такие как объекты соединений и команд.
Взаимодействие с другими людьми
источник
Product
(как абстрактно), а потомProduct1
иProduct2
как сыновья? Это поможет понять, что Factory Method - это просто создание одного продукта, тогда как Abstract Factory - это более или менее совокупность Factory Method, собранных вместе в семьи.Эти два шаблона, безусловно, связаны!
Разница между паттернами обычно заключается в намерении.
Намерение из Factory Method является «Определить интерфейс для создания объекта, но пусть подклассы решить , какой класс инстанцировать. Фабричный метод позволяет в класс отложить создание экземпляра на подклассы.»
Намерение в Abstract Factory является «Обеспечение интерфейса для создания семейств связанных или зависимых объектов без указания их конкретных классов.»
Основываясь исключительно на этих заявлениях о намерениях (цитируемых GoF), я бы сказал, что действительно Factory Method в некотором смысле является «вырожденным» абстрактным Factory с семейством из одного.
Как правило, они имеют различную реализацию, поскольку Factory Method намного проще, чем Abstract Factory .
Однако они связаны также в реализации. Как отмечено в книге GoF,
В этой вики c2 также есть интересные обсуждения по этой теме.
источник
Кажется, что список (отличных) вопросов OP был проигнорирован. Текущие ответы просто предлагают перефразированные определения. Поэтому я постараюсь кратко ответить на исходные вопросы.
Нет . Абстрактная фабрика должна создать более одного продукта, чтобы создать «семейство связанных продуктов». Канонический пример GoF создает
ScrollBar()
иWindow()
. Преимущество (и цель) в том, что Абстрактная фабрика может применять общую тему для нескольких своих продуктов.Во-первых, мы должны отметить, что ни Java, ни C # не существовали, когда GoF писал свою книгу. Использование GoF термина « интерфейс» не связано с типами интерфейсов, представленными конкретными языками. Следовательно, конкретного создателя можно создать из любого API. Важным моментом в шаблоне является то, что API использует свой собственный фабричный метод, поэтому интерфейс только с одним методом не может быть фабричным методом в большей степени, чем он может быть абстрактной фабрикой.
Этот вопрос больше недействителен после ответов выше; однако, если вы остались думать, что единственная разница между абстрактным фабричным методом и фабричным методом - это количество созданных продуктов, подумайте, как клиент использует каждый из этих шаблонов. Абстрактная фабрика обычно вводится в своего клиента и вызывается через композицию / делегирование. Заводской метод должен быть унаследован. Итак, все возвращается к старым дебатам о композиции и наследовании.
Но эти ответы подняли четвертый вопрос!
Если метод статический, его обычно называют статической фабрикой . Если метод нестатический, его обычно называют простой фабрикой . Ни один из них не является шаблоном GoF, но на практике они используются гораздо чаще!
источник
На мой взгляд, небольшая разница между двумя шаблонами заключается в применимости и, как уже было сказано, в намерении .
Напомним определения (оба из Википедии).
Абстрактная фабрика
Заводской метод
Оба шаблона позволяют отделить пользовательские объекты от создания необходимых экземпляров (разъединение во время выполнения), и это общий аспект. Оба шаблона позволяют создавать иерархию фабрик в соответствии с любыми конкретными потребностями, и это еще один общий аспект.
Абстрактная фабрика позволяет создавать несколько разных типов экземпляров в одном подклассе и конкретизировать поведение творений в его разных подклассах; Обычно метод Factory объявляет о создании только одного типа объекта, который может быть детализирован в соответствии с механизмом подкласса. Вот в чем разница.
Подводя итог. Предположим, что Product определяет суперкласс создаваемых объектов, а ProductA и ProductB - два разных подкласса. Следовательно, метод абстрактной фабрики будет иметь два метода: createProductA () и createProductB (), которые будут детализированы (с точки зрения шагов создания) в своих конкретных подклассах: фабричные подклассы детализируют шаги создания для двух определенных классов. создаваемых объектов.
Согласно приведенному выше примеру, Factory Method будет реализован по-разному, абстрагируясь от создания ProductA и ProductB на таком количестве фабрик (один метод на Factory), а дальнейшая специализация шагов создания будет делегирована иерархии по мере ее построения. .
источник
Если бы я создал абстрагированный (на который имеется ссылка через интерфейс или абстрактный базовый класс) фабричный класс, который создает объекты, которые имеют только один метод для создания объектов, то это будет фабричный метод .
Если бы у абстрактной фабрики было более одного метода для создания объектов, то это была бы абстрактная фабрика .
Допустим, я делаю диспетчер, который будет обрабатывать потребности методов действий для контроллера MVC. Если бы у него был один метод, скажем, для создания объектов движка, которые будут использоваться для создания моделей представления, то это был бы шаблон фабричного метода. С другой стороны, если бы у него было два метода: один для создания механизмов модели представления, а другой - для создания движков модели действия (или как вы хотите называть модель, в которой метод действия содержит потребителей), то это была бы абстрактная фабрика.
public ActionResult DoSomething(SpecificActionModel model) { var actionModelEngine = manager.GetActionModelEngine<SpecificActionModel>(); actionModelEngine.Execute(SpecificActionModelEnum.Value); var viewModelEngine = manager.GetViewModelEngine<SpecificViewModel>(); return View(viewModelEngine.GetViewModel(SpecificViewModelEnum.Value); }
источник
Хотя прошло много лет с тех пор, как люди из StackOverflow задавали эту проблему так же, как и в других сообщениях (самый старый относится к 2009 году), я все еще не мог найти ответ, который хотел.
Итак, я провел несколько часов исследований в сети, просмотрел примеры и пришел к выводу, что основные отличия Abstract Factory от Factory Method заключаются в
Встречные примеры были бы
Следовательно, когда конечная группа объектов должна иметь один и тот же стиль без исключения объекта, и вы хотите скрыть эту деталь «сохранения того же стиля», тогда мы должны использовать Абстрактную фабрику.
источник
Насколько я понимаю значение определений абстрактных фабрик и фабричных методов, первый реализован в статическом контексте и предоставляет объект на основе входных параметров.
Второй использует уже созданный объект (семейство), реализующий интерфейс фабричного метода. Затем фабричный метод создает конкретный экземпляр, связанный с исходным объектом, независимо от того, какой это объект.
Обычно это приводит к использованию обоих шаблонов вместе, где на первом этапе вы создаете некий общий объект, который описывает семейство связанных объектов. Вызывается статическим методом getInstance ("моя фамилия") методом. Реализация такого метода getInstance решает, какой объект семейства будет создан.
Затем я вызываю метод createProduct () для вновь созданного объекта семейства, и в зависимости от объекта семейства возвращается новый продукт.
Кажется, что эти паттерны взаимодействуют друг с другом.
Другими словами, Abstract Factory ориентирована на то, «ЧТО будет создано», и метод Factory «КАК» будет создан.
источник
Все, что вам нужно помнить, это то, что абстрактная фабрика - это фабрика, которая может возвращать несколько фабрик . Итак, если у вас есть AnimalSpeciesFactory, он может возвращать такие фабрики:
Mamalfactory, BirdFactory, Fishfactory, ReptileFactory. Теперь, когда у вас есть единственная фабрика из AnimalSpeciesFactory, они используют фабричный паттерн для создания определенных объектов. Например, представьте, что у вас есть ReptileFactory из этого AnimalFactory, а затем вы можете предложить создать объекты-рептилии, такие как: змеи, черепахи, объекты-ящерицы.
источник
источник
Шаблон фабричного метода - это шаблон творческого проектирования, который занимается созданием объектов без указания точного класса создаваемого объекта. Этот шаблон проектирования в основном позволяет классу откладывать создание экземпляра до подклассов.
Шаблон «Абстрактная фабрика» служит инкапсуляции для группы отдельных фабрик, не раскрывая конкретные классы. В этой модели общий интерфейс абстрактного фабричного класса используется для создания требуемого конкретного объекта, отделяющего детали реализации объектов от их использования и композиции. Этот шаблон проектирования широко используется в приложениях с графическим пользовательским интерфейсом, где необходимо создать аналогичные компоненты графического интерфейса.
во время поиска в Google я подошел к следующему блогу, который блестяще объяснил оба шаблона дизайна. взгляни на эти
http://simpletechtalks.com/factory-design-pattern/
http://simpletechtalks.com/abstract-factory-design-pattern/
источник