Шаблон проектирования Builder: Почему нужен ли нам директор?

Недавно я наткнулся на шаблон проектирования Builder. Кажется, что разные авторы используют «Паттерн Строитель». для обозначения различных разновидностей, поэтому позвольте мне описать шаблон, о котором я спрашиваю.

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

 1. Add liquids.
 2. Mix well.
 3. Add dry ingredients.
 4. Mix well.
 5. Pour batter into baking pan.
 6. Bake.
 7. Return baked cake.

Для разных тортов потребуются разные реализации этих шагов, т. Е. Какие жидкости / сухие ингредиенты использовать, с какой скоростью смешивать, как долго выпекать и т. Д.

Образец говорит делать это так. Для каждого продукта мы создаем класс конкретного строителя с реализацией каждого из вышеперечисленных шагов. Все эти классы являются производными от базового класса абстрактного построителя , который по сути является интерфейсом. Так, например, у нас будет абстрактный базовый класс CakeBaker с чистыми виртуальными методами AddLiquid () , MixLiquids () и т. Д. быть конкретными подклассами, например,

class ChocolateCakeBaker : public CakeBaker {
public:
   virtual void AddLiquids()
   {
        // Add three eggs and 1 cup of cream
   }

   virtual void AddDryIngredients()
   {
       // Add 2 cups flour, 1 cup sugar, 3 tbsp cocoa powder,
       // 2 bars ground chocolate, 2 tsp baking powder
   }
      ...
      ...
};

LemonCitrusCakeBaker также будет подклассом CakeBaker , но будет использовать разные ингредиенты и количества в своих методах.

Различные типы пирожных будут аналогично подклассы абстрактного базового класса Cake

Наконец, у нас есть класс для реализации абстрактного алгоритма. Это директор . В примере с пекарней мы могли бы назвать его ExecutiveBaker . Этот класс примет (от клиента) конкретный объект-конструктор и использует его методы для создания и возврата желаемого продукта.

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

34
задан Micha Wiedenmann 10 September 2018 в 08:32
поделиться