Builder Design Pattern in C++
Das Builder Design Pattern ist ein weiteres Entwurfmuster (Creational patterns) und dient der Separierung der Erstellung von Objekten von deren Repräsentation. Ziel ist ein einfacher Prozess zur Erstellung von komplexen Objekten, die unterschiedlichste Repräsentationen haben können.
Builder Design Pattern in C++
Der implementierte Builder erstellt ein komplexes Objekt. Wie das Objekt im Detail erstellt wird interessiert weniger, das Ergebnis ist ein fertiges Objekt. Der Builder erlaubt dabei auch die Erstellung unterschiedlicher Objekte und kann selbst durch Einsatz anderer Design Patterns wie beispielsweise Singleton implementiert werden.
Beispiel
Um beim Rollenspiel der letzten Design Patterns zu bleiben erstellen wir mit diesem Builder einen Helden. Das als HeroBuilder umgesetzte Builder Design Pattern erlaubt die Erstellung unterschiedlichster Helden, wobei die Erzeugung eines Helden ein komplexer Prozess ist. Dieser erfolgt Schritt für Schritt und ist im Beispiel simplifiziert.Der Held wird mit diversen Attributen und Gegenständen im Inventar erstellt. Die Präsentation ist vom Erstellungsprozess entkoppelt. Das Beispiel ermöglicht die Erstellung 3 unterschiedlicher Helden mit unterschiedlicher Ausgabe. Den Source Code findet man wie immer auf meiner GitHub Seite.
Ein Held (Hero.h) hat neben Basiseigenschaften wie Name und Rollenspielattribute noch Methoden für das Inventar:
class Hero { public: Hero(string name, int strength, int dexterity, int willpower) : name(name), strength(strength), dexterity(dexterity), willpower(willpower) {}; void showItems(); void addItem(Item item); private: std::list inventory; int strength; int dexterity; int willpower; string name; };
Der HeroBuilder (HeroBuilder.h) bietet eine Methode pro möglicher Klasse:
class HeroBuilder { public: Hero buildWarrior(); Hero buildWizard(); Hero buildRogue(); };
Implementiert ist eine der Funktionen (HeroBuilder.cpp) beispielsweise so:
Hero HeroBuilder::buildWarrior() { Hero warrior = Hero("Conan the Barbarian", 100, 30, 30); warrior.addItem(Sword("Sword of Power", 150, 50.0f)); warrior.addItem(Shield("Shield of Resistence", 100, 30.0f)); return warrior; }
Durch die einfache Schritt für Schritt Implementierung ist es recht einfach zu einem späteren Zeitpunkt in den Erstellungsprozess neue Features zu integrieren (in unserem Fall vielleicht Reittiere, umfangreicheres Inventar oder spezieller Eigenschaften). Werden die erstellten Objekte zu komplex kann man sich überlegen von HeroBuilder abgeleitete Spezialklassen zu erstellen.
Die main Funktion ist recht einfach gehalten:
int main(int argc, char **argv) { HeroBuilder *herobuilder = new HeroBuilder(); Hero hero1 = herobuilder->buildWarrior(); Hero hero2 = herobuilder->buildWizard(); hero1.showItems(); hero2.showItems(); return 0; }
Fazit
Die Erstellung eines komplexen Objekts kann in einem implementierten Builder Design Pattern gut umgesetzt werden. Meistens werden Builder Pattern gemeinsam mit anderen Entwurfsmustern gemeinsam verwendet. Der Builder fokussiert sich dabei auf der schrittweisen Erstellung des Objekts. Aus dieser Schritt für Schritt Anleitung ergeben sich unterschiedliche Repräsentationen dieser Objekte.