Недавно я наткнулся на шаблон проектирования 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.
Для разных кексов потребуются разные реализации этих этапов, т. Е. Какие жидкости / сухие ингредиенты использовать, с какой скоростью смешивать, как долговыпекать и т. д.
Шаблон говорит, что нужно делать это так.Для каждого продукта мы создаем класс concrete builder с реализацией для каждого из вышеуказанных шагов.Все эти классы являются производными от базового класса abstract builder *1013*, который по сути является интерфейсом.Так, например, у нас будет абстрактный базовый класс 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
.Этот класс будет принимать (от клиента) конкретный объект конструктора и использовать его методы для создания и возврата желаемого продукта.
Вот мой вопрос.Почему нам нужно, чтобы директор был отделен от абстрактного конструктора?Почему бы не свернуть их в один базовый класс абстрактного построителя, сделав защищенными открытые методы исходного абстрактного построителя (и конкретные подклассы переопределяют их, как и раньше).