Когда фабричный метод лучше простого фабричного и наоборот? - PullRequest
6 голосов
/ 17 июня 2010

Прохожу путь через книгу Head First Design Patterns.

Мне кажется, я понимаю простой фабричный и фабричный метод, но мне сложно понять, какие преимущества фабричный метод дает по сравнению с простым фабричным.

Если объект A использует простую фабрику для создания своих объектов 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.

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

Кажется, между ними не так уж много выбора. Либо вы должны выбрать, с какой BFactory вы хотите составить A, либо выбрать правильный подкласс A, чтобы получить Bs.

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

Спасибо всем!

Редактировать: Немного добавить к путанице. ИМО - это объяснение, данное в повествовании «Первая глава», где они переходят от простого метода к фабрике, говоря (стр.119) «франшизы использовали вашу [простую] фабрику для создания пиццы, но начинают использовать свои собственные домашние процедуры для остальной части процесса: они пекли вещи немного по-другому ... ", и у них есть такая картина шеф-повара, который, очевидно, сделал что-то отвратительное с его пиццей.

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

Так что мне кажется, что Head First подразумевает, что использование фабричного метода вместо простой фабрики является фиктивным.

Ответы [ 3 ]

2 голосов
/ 24 июня 2010

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

В случае

A myA = new SomeConcreteA()

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

В случае

A myA = new A(myBFactory())

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

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

1 голос
/ 23 июня 2010

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

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

0 голосов
/ 28 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...