Паттерны GoF - Builder (лекция)
Автор: MiF
<MiF> Builder :)
<MiF> Назначение - отделяет конструирование сложного обекта от его
представления, в результате одного и того же процесса конструирвоания могут
получатся разные представления
<MiF> Участники:
<MiF> 1. Builder - абстраутный интерфейс для создания частей продукта
<MiF> 2. ConcreteBuilder - реализует интерфейс, как следствие конструирует
объект по частям и собирает все вместе
<MiF> предоставляет интерфейс для доступа к продукту
<MiF> и следит за создаваемым представлением
<MiF> 3. Director - конструирует объект с помощью интерфейса Builder
<MiF> 4. Product - сам продукт, сложный составной объект, включает классы
которые, которые определяют его отдельные части и интерфейсы для сборки
конечно продукта из частей
<MiF> * -минус- которые
<MiF> Короче что все это дает:
<MiF> 1. есть интерфейс, через него можно управлять процессом сборки сложного
продукта, внутреняя структура объекта скрыта нафиг
<MiF> 2. код реализующий конструирование и представление изолирвонан
<MiF> это основное
<MiF> а Rageous даст нам пример :)
<Rageous|zZzZz> эм...
<Rageous|zZzZz> подстава
<MiF> ?
<Rageous|zZzZz> ну, скажем, пусть будет билдер юнита
<Rageous|zZzZz> есть методы конструирования основы, башни, пушки разных юнитов
<DobroKOT> сбор состояния игры из её конфигов.
<DobroKOT> имхо, чиста билдер.
<Rageous|zZzZz> есть директор, который умеет собирать из них танки
<DobroKOT> или опять же -
<DobroKOT> сборка танка rageous по его конфигу в файле.
<Rageous|zZzZz> угу
<Rageous|zZzZz> сборка уровня по файлу уровня
<MiF> оживились блин сразу
<DobroKOT> неполиморфная фабрика - это тоже фабрика?
<DobroKOT> а что такое тогда фабричный метод, но без фабрики?
<MiF> можешь называть фабрикой все что создает объекты
<MiF> но есть два паттерна AbstractFactory и FactoryMethod
<MiF> первый в реализации использует второй
<MiF> обычно
<DobroKOT> ага. вроде с AbstractFactory понятно - virtual product1
*create_product1, virtual product1 *create_product2, virtual product1
*create_product3
<DobroKOT> кстати, пример из геймедева -
<DobroKOT> IDirect3DDevice
<MiF> :)
<DobroKOT> который создаёт текстуры, шейдеры и т.п.
<DobroKOT> а FactoryMethod в чистом виде что такое?
<MiF> виртуальный метод, производящий объект
<Rageous|zZzZz> насколько я понимаю: функция, которая решает, что ей
инстанцировать - и делает это, возвращая объект клиенту
<MiF> реализации разные могут быть
<DobroKOT> аааа!
<DobroKOT> точна!
<DobroKOT> Create("shambler");
<CEMEH> Спрошу по-другому. Приведите пример, когда можно будет сказать "О,
заюзаем билдер" и станет понятно.
<DobroKOT> Create("imp");
<CEMEH> А не когда - "вообще-то это в каком-то смысле билдер" "Да ну, в каком?"
<Sark7> .
<DobroKOT> CEMEH, кажется, это называется ещё data drived =)
<Sark7> во
<Sark7> я так и не понял
<Sark7> на кой хрен нужен директор
<DobroKOT> "давайте танк соберём по конфигам, а не в С++ коде"
<Rageous|zZzZz> CEMEH, создание юнита по данным: типа Builder.ConstructUnit("tan
k")
<Sark7> с билдером еще ладно
<Sark7> хотя та же фабрика
<Sark7> чем отличается билдер от фабрики?
<Rageous|zZzZz> Sark7, директор - это та часть билдера, которая руководит
процессом сборки
<MiF> директор = клиент
<Sark7> а билдер сам не руководит?
<MiF> нет
<CEMEH> Да, пример с танком пойдет. И не надо про девайс.
<Sark7> а почему?
<MiF> билдер - интерфейс для настройки считай
<Rageous|zZzZz> эм...
<Sark7> я не пойму
<Sark7> ну пример такого интерфейса
<Sark7> что там вообще
<DobroKOT> д3девас - фабрека в чистом виде?
<MiF> давайте пример кода запосчу?
<Rageous|zZzZz> давайте
<Rageous|zZzZz> еще билдер, например, используется у нас для загрузки уровня:
есть куча методов типа "создать дерево", которым на вход дается поток или еще
какие-то данные, а в результате можно получить собранный уровень
<Rageous|zZzZz> руководит процессом некий лоадер (по сути - директор), который
и вызывает методы билдера
<Sark7> т.е. любой метод вида T foo(...) - билдер?
<kas> видима да
<Qiller> XML SAX writer - билдер в чистом виде...
<Sark7> а директор тогда кто
<kas> как масть ляжет
<Rageous|zZzZz> не, билдер - это не метод )
<Rageous|zZzZz> билдер так или иначе имеет минимум 2 метода :)
<Rageous|zZzZz> 1) создать объект
<Rageous|zZzZz> 2) получить результат
<kas> T foo(...)
<kas> чем тебе не создать и получить?
<Sark7> ну вообще-то foo это 2 в одном тогда
<Rageous|zZzZz> кас, то, что ты показываешь - это скорее обычный фабричный метод
<kas> а пачиму не билдер?
<Rageous|zZzZz> потому что билдер передается в директора
<kas> ну, передастья
<Sark7> так кто такой директор
<Sark7> скажите мне уж
<kas> void bar(){foo(); }
<kas> бар - директар
<Sark7> ааа
<Sark7> void foobar() { bar(); }
<Rageous|zZzZz> директор специализируется билдером - а как ты здесь ему
просунешь новый билдер?
<kas> хм
<Rageous|zZzZz> процесс выглядит так:
<kas> что значит специализируется билдером?
<Rageous|zZzZz> 1) создание билдера
20 января 2006