Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > абстрактная фабрика и фабричный метод


Автор: redwhite90 9.3.2013, 21:47
Помогите почувствовать разницу между фабричным методом и абстрактной фабрикой - смотрю на 2 диаграммы и не вижу разницы.
http://s1.ipicture.ru/uploads/20130309/zxu8iqhh.bmp

из вычитанного везде -  делаю вывод о разном количестве интерфейсов продуктов. Но это как-то нелогично.

Автор: jk1 10.3.2013, 11:06
Имхо FactoryMethod - вырожденный случай AbstractFactory для одного продукта. AbstractFactory оперирует целым семейством продуктов, каждый из которых имеет собственный интерфейс. Так что AbstractFactory добавляет еще один уровень абстракции к FactoryMethod

Автор: redwhite90 10.3.2013, 11:37
я тоже вроде как в голове осознаю, что дополнительный уровень абстракции создаётся, но путаюсь в картинках

вот это uml фабричного метода:


http://www.radikal.ru

куда абстракцию надо добавить? я просто очень запутался  в диаграммах.

Автор: batigoal 11.3.2013, 16:22
redwhite90, картинка будет такая же, но будет не один factoryMethod, а несколько - createProductA(), createProductB()...

Грубо говоря, Factory Method - это просто альтернатива конструктору (зачастую более удобная). Пример: 
Код

Response response = Response.fromRequest(request);

Просто способ скрыть создание обьекта, не вызывая конструктор явно.

Фабрика же - это гораздо более развесистая штука, позволяющая создавать не объект, а семейство родственных объектов. Канонический пример - интерфейс UiFactory с методами createButton, createMenu, etc с имплементациями под разные платформы или оконные менеджеры.

Автор: redwhite90 11.3.2013, 22:23
Если ориентироваться на картинки, то моё мнение сейчас такое:
клиентом(тот кто использует полученный продукт) в фабричном методе является creator(см. картинку), а в абстрактной фабрике есть надстройка над creator, которая собственно и позволяет делать "семейства".
Поправьте, если не прав.

Добавлено через 26 секунд
эта надстройка - есть клиент

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)