Недавно я столкнулся с шаблоном проектирования 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
. Этот класс будет принимать (от клиента) конкретный объект-строитель и использовать его методы для создания и возврата желаемого продукта.
Вот мой вопрос. Зачем нам нужно, чтобы директор был отделен от абстрактного строителя? Почему бы не перевернуть их в один базовый базовый класс строителя, сделав защищенные общедоступные методы оригинального абстрактного строителя (и конкретные подклассы переопределяют их, как и раньше).