Kürzlich bin ich auf das Entwurfsmuster Builder gestoßen. Es scheint, dass verschiedene Autoren "Builder-Muster" verwenden, um sich auf verschiedene Varianten zu beziehen, also lassen Sie mich das Muster beschreiben, nach dem ich frage.
Wir haben einen Algorithmus zur Erstellung von Produkte d. h. Objekte unterschiedlicher Art. Auf einer ausreichend hohen Abstraktionsebene ist der Algorithmus für alle Produkttypen gleich, aber jeder Produkttyp erfordert eine andere Implementierung der einzelnen abstrakten Schritte des Algorithmus. Zum Beispiel könnte der folgende Algorithmus zum Kuchenbacken verwendet werden:
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.
Verschiedene Kuchen erfordern unterschiedliche Umsetzungen dieser Schritte, d. h. welche Flüssigkeiten/Trockenzutaten zu verwenden sind, mit welcher Geschwindigkeit zu mischen ist, wie lange zu backen ist, usw.
Das Muster sagt, dass man es so machen soll. Für jedes Produkt erstellen wir eine Betonbauer Klasse mit einer Implementierung für jeden der oben genannten Schritte. Alle diese Klassen sind abgeleitet von einer abstrakter Konstrukteur Basisklasse, die im Wesentlichen eine Schnittstelle ist. Wir haben also zum Beispiel eine abstrakte Basisklasse CakeBaker
mit rein virtuellen Methoden AddLiquid()
, MixLiquids()
, usw. Die konkreten Kuchenbäcker werden konkrete Unterklassen sein, z.B.,
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
}
...
...
};
En LemonCitrusCakeBaker
wäre auch eine Unterklasse von CakeBaker
Er verwendet jedoch andere Zutaten und Mengen für seine Methoden.
Die verschiedenen Kuchentypen sind ebenfalls Unterklassen eines abstrakten Cake
Basisklasse.
Schließlich haben wir eine Klasse zur Implementierung des abstrakten Algorithmus. Dies ist die Direktor . In dem Beispiel der Bäckerei könnte man es als ExecutiveBaker
. Diese Klasse würde (vom Kunden) ein konkretes Builder-Objekt akzeptieren und dessen Methoden verwenden, um das gewünschte Produkt zu erstellen und zurückzugeben.
Hier ist meine Frage. Warum muss der Regisseur vom abstrakten Ersteller getrennt sein? Warum nicht rollen sie in einem einzigen Builder abstrakte Basisklasse, so dass die ursprüngliche abstrakte Builder öffentliche Methoden geschützt (und die konkrete Unterklassen überschreiben diese wie zuvor).