Этот паттерн очень похож на абстрактную фабрику, но в нем акцентируется пошаговое конструирование объекта - в отличие от фабрики, где конструируется семейство классов.
Предположим, что в Вашей игре нужно строить дворец правителя. Дворец состоит из трона, тюрьмы и молельни. Ваша игра должна создать дворец для каждой расы, и для создания дворца определяется абстрактный класс строитель:
class CPalaceBuilвer { public: // Эти функции выстраивают дворец virtual void buildPalace(){}; virtual void buildTron(){}; virtual void buildPrison(){}; virtual void buildChurch(){}; // А эта возвращает уже построенный дворец, // для базового класса пустышку. virtual CPalace* getPalace ( return NULL); }
Функции построения могут быть чистыми виртуальными или нет. Во всяком случае CPalaceBuilder должен объявить интерфейс для строительства дворца. Конкретные дворцы для гномов и людей должны создаваться классами-строителями, производными от CPalaceBuilder. Теперь движок Вашей игры может создавать дворцы для разных рас по одному алгоритму, если передавать в функцию создания разные указатели на разные конкретные строители:
CPalace* MyGame::createPalace(CPalaceBuilder* builder) { // Обратились к строителю для начала построения builder->buildPalace(); // Теперь все части дворца builder->buildTron(); builder->buildPrison(); builder->buildChurch(); // Теперь получаем собранный дворец - для строителя // это сигнал, что все закончено return builder->getPalace(); }
Совсем необязательно, чтобы продуктом был какой-то красивый составной объект. Вполне возможно, что Ваше приложение читает файл и просто желает его преобразовать в произвольный формат. Тогда преобразованием будет заниматься исключительно специализированный строитель - по одному на каждый формат. Типа такого:
CTargetDoc* CMyApp::convertTo(CConvTo& _cc) { // Начали новый документ _cc.startTarget(); // считываем до конца источник и направляем // стоителю слова на обработку while (!myFile.eof()) _cc.convertToken(myFile.readToken()); // Если все закончено, получить целевой документ return _cc.getTarget(); }
Мы будем получать документ в формате, определяемом параметром _cc - который собственно и есть строитель.
Структура паттерна такова: директор направляет строителю запросы на создание частей целевого объекта, и по завершении строительства запрашивает целевой объект полностью и сразу.