Шаблоны проектирования: Аннотация Factory vs Factory Метод

Примечание. Вопросы находятся в конце сообщения.

Я прочитал другие потоки stackoverflow, касающиеся Аннотация Factory vs Factory Метод. Я понимаю намерение каждого шаблона. Однако я не совсем понимаю это определение.

Factory Метод определяет интерфейс для создания объекта, но позволяет подклассы определяют, какие из них экземпляр. Метод Factory позволяет классы переносят подклассы.

В отличие от этого, Abstract Factoryпредоставляет интерфейс для создания семей связанных или зависимых объектов без указания их конкретные классы.

- Джон Фэминелла

Аннотация Factory выглядит очень похоже на Factory Метод. Я нарисовал несколько классов UML, чтобы проиллюстрировать мою точку зрения.

Примечание:

  • Диаграмма находится на сайте www.yuml.com, поэтому они не идеально ориентированы. Но это бесплатная услуга:).
  • Диаграммы могут быть не идеальными. Я все еще изучаю шаблоны дизайна GoF.

Factory Метод:

Factory Method

Аннотация Factory (только 1 участник):

Abstract Factory (only 1 member)

Аннотация Factory (больше участников):

alt text

Вопросы:

  • Если Аннотация Factory имеет только один создатель и один продукт, является ли он еще Аннотация Factory шаблоном? (интерфейс для создания семей)
  • Может ли созданный Factory метод конкретный создатель создать из интерфейса или он должен быть из класса? (классы переносят экземпляры в подклассы)
  • Если в тесте Factory может быть только один создатель и один продукт, это единственное отличие между Аннотация Factory и Factory, что создателем для первого является интерфейс, а создателем для последнего является класс?

Ответ 1

Надеюсь, это поможет. Он описывает различные типы заводов. Я использовал Head First Design Patterns в качестве моей ссылки. Я использовал yuml.me для диаграммы.

Статический Factory

Является классом со статическим методом для создания различных подтипов продукта.

Static Factory

Простой Factory

Является классом, который может создавать различные подтипы продукта. (Это лучше, чем Static Factory. Когда новые типы добавляются, базовому классу Product не нужно изменять только Simple Factory Class)

Simple Factoryt

Factory Метод

Содержит один метод для создания одного типа продукта, относящегося к его типу. (Это лучше, чем просто Factory, потому что тип отложен для подкласса.)

Factory Method

Аннотация Factory

Создает семейство типов, которые связаны между собой. Он заметно отличается от метода Factory, поскольку он имеет более одного метода типов, которые он производит. (Это сложное относится к следующей диаграмме для лучшего примера в реальной жизни).

Abstract Factory

Пример из .NET Framework

DbFactoriesProvider - это простой Factory, поскольку он не имеет подтипов. DbFactoryProvider является абстрактным Factory, поскольку он может создавать различные связанные объекты базы данных, такие как объекты соединения и команды.

Abstract Factory From .NET Framework

Ответ 2

Оба шаблона, безусловно, связаны!

Различие между шаблонами обычно в намерении.

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

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

Основываясь исключительно на этих намерениях (цитируется из GoF), я бы сказал, что действительно Factory Метод является в некотором смысле "вырожденным" <сильным > тестом Factory с семейством из них.

Как правило, они различаются в реализации, поскольку Factory Метод намного проще, чем Аннотация Factory.

Однако они связаны также с реализацией. Как отмечено в книге GoF,

AbstractFactory объявляет только интерфейс для создания продуктов. Это для подклассов ConcreteProduct для их создания. Наиболее распространенный способ сделать это - определить метод Factory для каждого продукта.

В этой c2 wiki также есть интересное обсуждение этой темы.

Ответ 3

Кажется, что список OP (отличных) вопросов игнорируется. Текущие ответы просто предлагают повторные определения. Поэтому я попытаюсь кратко рассмотреть исходные вопросы.

  • Если Аннотация Factory имеет только один создатель и один продукт, остается ли он Аннотация Factory шаблоном? (интерфейс для создание семей)

Нет. Аннотация Factory должен создать более одного продукта, чтобы создать "семейство связанных продуктов". Канонический пример GoF создает ScrollBar() и Window(). Преимущество (и цель) состоит в том, что Abstract Factory может обеспечить общую тему для множества своих продуктов.

  1. Может ли созданный конкретный создатель Factory Метод создать из интерфейса или он должен быть из класса? (классы откладывают экземпляры для подклассов)

Во-первых, мы должны отметить, что ни Java, ни С# не существовали, когда GoF писал свою книгу. Использование термина Термин интерфейса GoF не связано с типами интерфейсов, введенными конкретными языками. Таким образом, конкретный создатель может быть создан из любого API. Важным моментом в шаблоне является то, что API использует свой собственный метод Factory, поэтому интерфейс только с одним методом не может быть методом Factory больше, чем может быть абстрактным Factory.

  1. Если в тесте Factory может быть только один создатель и один продукт, это единственная разница между Аннотация Factory и Factory Метод, который создателем для первого является интерфейсом, а создателем для последнего является класс?

Этот вопрос больше недействителен, следуя приведенным выше ответам; однако, если вы считаете, что единственная разница между Abstract Factory и Factory Method - это количество созданных продуктов, подумайте, как клиент потребляет каждый из этих шаблонов. Абстрактный Factory обычно вводится в его клиент и вызывается посредством композиции/делегирования. A Factory Метод должен быть унаследован. Таким образом, все это возвращается к старой дискуссии против дедовства.

Но эти ответы подняли четвертый вопрос!

  1. Поскольку интерфейс только с одним методом не может быть Factory Метод больше, чем может быть Аннотация Factory, что мы называем с помощью только одного метода?

Если этот метод является статическим, его обычно называют Статический Factory. Если метод нестатический, его обычно называют Простым Factory. Ни один из них не является шаблоном GoF, но на практике они гораздо чаще используются!

Ответ 4

По моему мнению, небольшая разница между двумя шаблонами находится в применимости, и, как уже говорилось, в Намерении.

Обозначьте определения (как из Википедии).

Аннотация Factory

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

Factory Метод

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

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

Аннотация Factory позволяет создавать несколько разных типов экземпляров в одном подклассе и указывать поведение творения в разных подклассах; Обычно метод Factory объявляет создание только одного типа объекта, который может быть определен в соответствии с механизмом субклассификации. Это различие.

Подводя итог. Скажем, что Product определяет суперкласс для создаваемых объектов, а ProductA и ProductB - два разных подкласса. Таким образом, метод Abstract Factory будет иметь два метода: createProductA() и createProductB(), которые будут специфицированы (в терминах шагов создания) в его конкретных подклассах: подклассы Factory определяют шаги создания для два определенных класса объектов при создании.

В соответствии с вышеприведенным примером метод Factory будет реализован по-разному, абстрагируя создание ProductA и ProductB на любом заводе (один метод на Factory), а дальнейшая специализация шагов создания будет делегирована к иерархии по мере ее построения.

Ответ 5

Если я создал абстрагированный (ссылка через интерфейс или абстрактный базовый класс) Factory Класс, который создает объекты, которые имеют только один метод для создания объектов, тогда это будет Factory Метод.

Если у абстрактного Factory было более 1 метода для создания объектов, то это было бы Аннотация Factory.

Скажем, я создаю Менеджер, который будет обрабатывать потребности методов действий для контроллера MVC. Если бы у него был один метод, скажем, чтобы создать объекты движка, которые будут использоваться для создания моделей представлений, тогда это будет шаблон метода Factory. С другой стороны, если у него было два метода: один для создания двигателей модели представлений, а другой для создания движков модели действий (или того, что вы хотите назвать моделью, в которой метод действия содержит потребителей), тогда это будет абстрактный factory.

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

Ответ 6

Хотя прошло много лет, так как люди из StackOverflow сомневались в этом вопросе аналогично в других сообщениях (самый старый - 2009), я все еще не мог найти ответ, который я хотел.


Итак, я сделал несколько часов исследований через Интернет, просмотрев примеры и пришел к такому выводу, что основные отличия абстрактного метода Factory от Factory:

  • Цель: согласованность или "внешний вид" . Абстрактное Factory намерение состоит в том, чтобы сгруппировать семейство объектов с одним и тем же стилем (например, виджеты пользовательского интерфейса Look-and-feel, части того же стиля автомобиля, объекты из одной и той же ОС и т.д.). Многие примеры из Abstract Factory упоминают о ключевой фразе "тот же взгляд и чувство".
  • Объекты, образующие больший объект группы. Аннотация. Factory создает семейство объектов, образующих более крупный объект группы, а не один объект.
  • Позже добавьте новый стиль. Если мы продолжаем использовать метод Factory и пытаемся добавить новый стиль в существующую инфраструктуру, это будет болезненно. С Abstract Factory все, что нам нужно сделать, это просто создать новый конкретный Factory, который реализует абстрактный класс Factory.

Примеры счетчиков будут

  • Автомобильная часть для спортивного автомобиля, используемого в седане. Эта несогласованность может привести к несчастным случаям.
  • Кнопка стиля Windows в разных виджетах графического интерфейса ОС. Он не собирается ломать что-либо, но вредит пользовательскому опыту для некоторых людей, таких как я.
  • Позже мы узнаем, что наше программное обеспечение должно запускаться в следующем обновлении ОС, которому нужен другой набор совместимых системных объектов, сохраняя совместимость программного обеспечения.

Поэтому, когда конечная группа объектов должна иметь тот же стиль без исключения объекта, и вы хотите скрыть эту деталь "сохраняя тот же стиль", тогда мы должны использовать Abstract Factory.

Ответ 7

Насколько я понимаю смысл абстрактных описаний методов factory и factory, первый из них реализуется в статическом контексте и предоставляет объект на основе входных параметров.

Второй использует уже созданный объект (семейство), который реализует интерфейс метода factory. Затем метод factory создает конкретный экземпляр, относящийся к исходному объекту, независимо от того, кем он является.

Таким образом, это обычно приводит к совместному использованию обоих шаблонов, где на первом этапе вы создаете какой-то общий объект, который описывает семейство связанных объектов. Он вызывается методом статического метода getInstance ( "мое семейное имя" ). Реализация такого метода getInstance определяет, какой объект семейства будет создан.

Затем я вызываю метод createProduct() для вновь созданного объекта семейства и в зависимости от объекта семейства, будет возвращен новый продукт.

Кажется, что эти шаблоны взаимодействуют друг с другом.

Другими словами, Аннотация factory фокусируется на "ЧТО" будет создано и factory метод "КАК" будет создан.

Ответ 8

Все, что вам нужно запомнить, - это абстрактный factory factory, который может возвращать несколько фабрик. Поэтому, если у вас есть AnimalSpeciesFactory, он может вернуть такие фабрики, как это:

Mamalfactory, BirdFactory, Fishfactory, ReptileFactory. Теперь, когда у вас есть один factory из AnimalSpeciesFactory, они используют шаблон factory для создания определенных объектов objexts. Например, представьте, что у вас есть ReptileFactory из этого AnimalFactory, тогда вы можете предложить создавать объекты рептилий, например: Змеи, черепахи, ящерицы.

Ответ 9

Factory шаблон метода - это шаблон создания, который предназначен для создания объектов, не отображая точный класс создаваемого объекта. Этот шаблон дизайна в принципе позволяет классу отбрасывать экземпляр на подклассы.

Абстрактный шаблон Factory служит для инкапсуляции в группу отдельных заводов, не подвергая конкретным классам. В этой модели общий интерфейс абстрактного класса Factory используется для создания требуемого конкретного объекта, отделяющего детали реализации объектов от их использования и состава. Этот шаблон проектирования широко используется в приложениях с графическим интерфейсом, где необходимо создавать похожие компоненты GUI.

во время поиска в google я подошел к следующему блогу, который блестяще объяснил оба шаблона дизайна. посмотрите на эти

http://simpletechtalks.com/factory-design-pattern/

http://simpletechtalks.com/abstract-factory-design-pattern/