Этот паттерн очень похож на абстрактную фабрику, но в нем акцентируется пошаговое конструирование объекта - в отличие от фабрики, где конструируется семейство классов.
Предположим, что в Вашей игре нужно строить дворец правителя. Дворец состоит из трона, тюрьмы и молельни. Ваша игра должна создать дворец для каждой расы, и для создания дворца определяется абстрактный класс строитель:
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 - который собственно и есть строитель.
Структура паттерна такова: директор направляет строителю запросы на создание частей целевого объекта, и по завершении строительства запрашивает целевой объект полностью и сразу.
