Архитектура движка.Статьи

Паттерны GoF - Builder (лекция)

Автор:

<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> ну, скажем, пусть будет билдер юнита
    <Rageous|zZzZz> есть методы конструирования основы, башни, пушки разных юнитов
    <DobroKOT> сбор состояния игры из её конфигов.
    <DobroKOT> имхо, чиста билдер.
    <Rageous|zZzZz> есть директор, который умеет собирать из них танки
    <DobroKOT> или опять же -
    <DobroKOT> сборка танка rageous по его конфигу в файле.
    <Rageous|zZzZz> угу
    <Rageous|zZzZz> сборка уровня по файлу уровня
    <MiF> оживились блин сразу
  • DobroKOT так и непонял
  • <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) создание билдера

    Страницы: 1 2 Следующая »

    20 января 2006