Строитель
Builder
Назначение
Отделяет конструирование сложного объекта от его представления, так, что в результате одного и того же процесса конструирования могут получаться разные представления.
Результаты
1. В отличие от порождающих паттернов, которые сразу конструируют весь объект целиком, строитель делает это шаг за шагом под управлением распорядителя. И лишь когда продукт завершен, распорядитель забирает его у строителя. Это позволяет обеспечить более тонкий контроль над процессом конструирования, а значит, и над внутренней структурой готового продукта.
2. Поскольку продукт конструируется через абстрактный интерфейс, то для изменения внутреннего представления достаточно всего лишь определить новый вид строителя.
3. Паттерн изолирует код, реализующий конструирование и представление. Клиентам ничего не надо знать о классах, определяющих внутреннюю структуру продукта, так как они отсутствуют в интерфейсе строителя. Разные распорядители могут строить разные варианты продукта из одних и тех же частей.
Реализация
//
class Builder {
public:
virtual void BuildPartA()=0;
virtual void BuildPartB()=0;
};
//
class Director {
Builder *builder;
public:
Director(Builder *b):builder(b){}
void BuildProduct() {
builder->BuildPartA();
builder->BuildPartB();
...
}
};
//
class Product {...};
//
class ConcreteBuilder : public Builder {
Product *product;
public:
ConcreteBuilder():product(new Product()) {}
void BuildPartA();
void BuildPartB();
Product *GetProduct() { return product; }
};
//
ConcreteBuilder builder;
Director director(&builder);
director.BuildProduct();
Product *product=builder.GetResult();