Зачем использовать шаблон строителя? - PullRequest
5 голосов
/ 19 февраля 2012

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

Если шаблон построителя означает создание метода Construct в классе Director,который выполняет набор дочерних операций Builder ...

class Director {
  public static void Construct(Builder builder) {
    builder.BuildPartA();
    builder.BuildPartB();
    ...
  }
}

abstract class Builder {
  public abstract void BuildPartA();
  public abstract void BuildPartB();
  ...
}

class Builder1 : Builder { ... }
class Builder2 : Builder { ... }

void Main() {
  Builder1 b1 = new Builder1();
  Builder2 b2 = new Builder2();
  Director.Construct(b1);
  Director.Construct(b2);
}

... почему бы нам просто не переместить метод Construct в класс Builder?

class Builder {
  public virtual void BuildPartA();
  public virtual void BuildPartB();
  public void Construct() {
    BuildPartA();
    BuildPartB();
    ...
  }
  ...
}

class Builder1 : Builder { ... }
class Builder2 : Builder { ... }

void Main() {
  Builder1 b1 = new Builder1();
  Builder2 b2 = new Builder2();
  b1.Construct();
  b2.Construct();
}

Пожалуйста, покажите мне немногопример, в котором шаблон строителя действительно полезен.

Ответы [ 2 ]

6 голосов
/ 19 февраля 2012

Справочник должен знать правильную последовательность сборки различных компонентов для создания объектов. Я полагаю, что просто отделить задачу знания порядка или метода построения этих объектов от базового класса Builder (который является просто базовым классом). Если вы переместили конструкцию в базу Builder, она будет напоминать шаблон метода шаблона.

Лучше иметь отдельного директора, который знает, как собирать компоненты, потому что даже при том, что «рецепт» построения компонентов изменяется, базовый класс менять не нужно. Например, скажем, необходимо создать определенный класс компонентов, выполнив 3 шага в определенном порядке:

  1. Шаг А
  2. Шаг B
  3. Шаг C

Допустим, в какой-то момент к семейству добавлен еще один компонент, который можно построить с помощью тех же шагов, но в другом порядке:

  1. Шаг А
  2. Шаг С
  3. Шаг B

В этом случае, если логика для последовательности отделена в Director в отличие от базового класса Builder, можно наследовать новый директор и использовать его для построения. Если логика была в базовом построителе, базовом классе, который может быть частью отдельной библиотеки или JAR или файла заголовка в случае C ++, то это может потребовать перекомпиляции конкретных классов или, по крайней мере, доставки нового JAR.

Я уверен, что есть и другие преимущества разделения такой заботы.

1 голос
/ 20 февраля 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...