Когда метод фабрики лучше, чем простая фабрика и наоборот?

Прокладывание себе путь через Главную Первую книгу Шаблонов разработки.

Я полагаю, что понимаю простую фабрику и метод фабрики, но я испытываю затруднения при наблюдении того, что способствует методу фабрики, приносит по простой фабрике.

Если объект использование простая фабрика для создания ее объектов B, то клиенты могут создать его как это:

A a = new A(new BFactory());

тогда как, если объект использует метод фабрики, клиент может создать его как это:

A a = new ConcreteA(); // ConcreteA contains a method for instantiating 
                       // the same Bs that the BFactory above creates, with 
                       // the method hardwired into the subclass of A, ConcreteA.

Таким образом в случае простой фабрики, клиенты сочиняют с фабрикой B, тогда как с методом фабрики, клиент выбирает соответствующий подкласс для типов B, который это хочет.

Действительно, кажется, нет очень для выбора между ними. Или необходимо выбрать, с каким BFactory Вы хотите сочинить, или необходимо выбрать правильный подкласс, чтобы дать Вам бакалавра наук.

При каких обстоятельствах один лучше, чем другой?

Спасибо все!

Править: Добавление немного к беспорядку, IMO является объяснением, данным в Главном Первом рассказе, где они переходят от простой фабрики до метода фабрики путем высказывания (p.119) "франшизы, использовало [простую] фабрику для создания пицц, но начинающий использовать их собственные процедуры собственной разработки остальной части процесса: они испекли бы вещи немного по-другому.." и у них есть то изображение шеф-повара, который, по-видимому, сделал что-то отвратительное к его пиццам.

Но нет ничего об использовании простой фабрики, которая предоставляет клиентский доступ к печению () метод или любая из других частей процесса. И нет ничего об использовании метода фабрики, который помог бы, если бы была какая-либо проблема с ним.

Таким образом, это смотрит на меня как причина, которую Голова Сначала подразумевает для использования метода фабрики по простой фабрике, является поддельным..

6
задан Stefan Steinegger 1 July 2010 в 07:49
поделиться

3 ответа

Сравните диаграммы UML на странице 117 и 131. Дело в том, что простой Factory решает, как испечь пиццу для PizzaStore. Метод Factory позволяет конкретной фабрике PizzaFactory решать, как испечь пиццу. Фабрики - это управление зависимостями. Используя конструктор, вы должны решить, какой класс инстанцировать. Используя простую фабрику, вы позволяете конкретному классу решать, какой класс инстанцировать. Используя метод Factory, вы позволяете любому классу (который может) решать, какой класс инстанцировать. Используя абстрактную фабрику, вы позволяете любому классу (который может) решать, какой класс инстанцировать, независимо от того, какой экземпляр вы хотите создать. Инверсия контроля - это использование того, что вы получили, потому что решение было принято, когда божественное существование создало вас.

Мое личное мнение, что оригинальная книга Design Pattern от GoF, хотя и не так хороша в объяснении, имеет больше примеров из реального мира.

1
ответ дан 17 December 2019 в 18:10
поделиться

Проанализируйте различия с точки зрения различных ролей: пользователи A и поставщики A. Шаблоны имеют разные значения для этих ролей, они важны, поскольку вещи меняются с течением времени.

В случае

A myA = new SomeConcreteA()

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

В случае

A myA = new A(myBFactory())

клиент теперь должен знать о B и их фабриках и имеет полный контроль над тем, какую фабрику использовать. Поставщик возложил на клиента гораздо больше ответственности, и мы, возможно, увеличили взаимосвязь - теперь клиентский код явно зависит как минимум от еще одного класса. Поставщику A нечего делать, когда появляются новые виды B.

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

2
ответ дан 17 December 2019 в 18:10
поделиться

Вы правы в том, что все, что изменилось с Simple Factory на Factory Method, это то, что в Simple Factory фабрика передавалась через конструктор, и мы использовали ее для создания нашего объекта. В Factory Method вызов теперь осуществляется к абстрактному методу в нашем абстрактном классе фабрики; но это очень мощно. Поскольку метод является абстрактным, он должен быть реализован в наших подклассах, чего мы и хотим. Наши подклассы могут реализовать свои собственные вариации, но определенное поведение все равно будет навязано нашим абстрактным классом. Еще более мощным является то, что мы можем расширить количество фабрик без изменения исходного кода, просто добавляя новые классы, которые наследуются от абстрактного базового класса.

0
ответ дан 17 December 2019 в 18:10
поделиться