printПорождающие паттерны

printСтроитель

Builder

Назначение
Отделяет конструирование сложного объекта от его представления, так, что в результате одного и того же процесса конструирования могут получаться разные представления.

Результаты
1. В отличие от порождающих паттернов, которые сразу конструируют весь объект целиком, строитель делает это шаг за шагом под управлением распорядителя. И лишь когда продукт завершен, распорядитель забирает его у строителя. Это позволяет обеспечить более тонкий контроль над процессом конструирования, а значит, и над внутренней структурой готового продукта.
2. Поскольку продукт конструируется через абстрактный интерфейс, то для изменения внутреннего представления достаточно всего лишь определить новый вид строителя.
3. Паттерн изолирует код, реализующий конструирование и представление. Клиентам ничего не надо знать о классах, определяющих внутреннюю структуру продукта, так как они отсутствуют в интерфейсе строителя. Разные распорядители могут строить разные варианты продукта из одних и тех же частей.

Реализация
// Строитель задает абстрактный интерфейс для создания частей объекта Product
class Builder {
public:
  virtual void BuildPartA()=0;
  virtual void BuildPartB()=0;
};
// Распорядитель конструирует объект, пользуясь интерфейсом Builder
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();
loading