Шаг 3 - Паттерн Строитель. Builder

Этот паттерн очень похож на абстрактную фабрику, но в нем акцентируется пошаговое конструирование объекта - в отличие от фабрики, где конструируется семейство классов.

Предположим, что в Вашей игре нужно строить дворец правителя. Дворец состоит из трона, тюрьмы и молельни. Ваша игра должна создать дворец для каждой расы, и для создания дворца определяется абстрактный класс строитель:

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 - который собственно и есть строитель.

Структура паттерна такова: директор направляет строителю запросы на создание частей целевого объекта, и по завершении строительства запрашивает целевой объект полностью и сразу.

3_1.gif (3851 b)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Albert Makhmutov - 02.07.2001