Klassenstrukturen können manchmal recht komplex werden. Dann wird alleine schon die Instanzierung ein Verstoß gegen das DRY-Prinzip, oder soll dem Anwender nicht zugemutet werden. Hier kann ein Builder aushelfen.
Ein Builder ist wie sein Name schon sagt eine Klasse, deren Aufgabe es ist eine andere Klasse aufzubauen. Häufig werden Builder zur besseren Übersicht als Fluent Interface aufgebaut, das heißt, dass alle Methoden den Builder selbst zurück geben. Zum Schluss muss dann natürlich noch die Instanz der eigentlichen Klasse geliefert werden.
Beispiel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
namespace Car; class Builder { private $car; public function __construct() { $this->car = new Car(); } public function addDoors() { $this->car->setLeftDoor(new Part\Door()); $this->car->setRightDoor(new Part\Door()); return $this; } public function addEngine($type) { $engine = new Part\Engine(); if ($type == 'cheap') { $engine->diesAfter('5000 km'); } $this->car->addEngine($engine); return $this; } public function get() { return $this->car; } } |
Verwendung
1 2 3 4 |
$cb = new \Car\Builder(); $car = $cb->addDoors() ->addEngine('expensive') ->get(); |