Menu

Baumuster prüfung

13Jul

Mit dem Builder-Muster können Sie Produkte Schritt für Schritt erstellen. Sie können die Ausführung einiger Schritte verschieben, ohne das Endprodukt zu brechen. Sie können Schritte sogar rekursiv aufrufen, was nützlich ist, wenn Sie einen Objektbaum erstellen müssen. Im obigen Beispiel haben wir die ConstructionEngineer-Klasse mit einem Konstruktor geschrieben, der ein HouseBuilder-Objekt akzeptiert. In der constructHouse()-Methode haben wir eine Reihe von Aufrufen für das HouseBuilder-Objekt in einer bestimmten Reihenfolge durchgeführt und das letzte House-Objekt an den Aufrufer zurückgegeben. Beachten Sie, dass die ConstructionEngineer-Klasse nicht an einen Betonbauer gebunden ist. Außerdem verwendet diese Klasse den gleichen Konstruktionsprozess in der constructHouse()-Methode, unabhängig von der Art des Betonbauers, der ihr zur Laufzeit zur Verfügung gestellt wird. Dies ermöglicht es uns, neue Betonbauklassen hinzuzufügen, ohne Änderungen am Bauprozess vorzunehmen. Nun, da unser Hausbaubeispiel fertig ist, schreiben wir einen Komponententest, um das Baumuster bei der Arbeit zu beobachten. ConstructionEngineerTest.java Nette Erklärung, aber können Sie das obige Beispiel erweitern, um einen MobileHomeBuilder zu erstellen, der einen PrefabricatedHouseBuilder erweitert (auch wenn Mobilheime in der Regel keine Fundamente haben), um ein zusätzliches Objekt wie CarPort für das Mobilheim einzuschließen? Hier habe ich Probleme: Builder-Muster mit Vererbung. Ich habe fast zwei Tage damit verbracht, zu erforschen, wie man dies effektiv tun und das DRY-Prinzip anwenden kann. Betrachtet man viele Beispiele, darunter stackoverflow.com/questions/17164375/subclassing-a-java-builder-class und egalluzzo.blogspot.co.at/2010/06/using-inheritance-with-fluent.html aber alle scheinen sich auf eine abstrakte Klasse zu verlassen. Es muss einen bewährten Ansatz (irgendwo) geben, um die Verwendung eines Builders für (ex) ClassC zu ermöglichen, der ClassB erweitert (und ClassB-Builder verwendet), der ClassA erweitert (und ClassA-Builder verwendet) – und einen, bei dem ich entweder ein ClassA-, ClassB- oder ClassC-Objekt (über die jeweiligen Builder) erstellen kann.

Jede Hilfe würde sehr geschätzt werden. In diesem Beispiel des Builder-Musters wird veranschaulicht, wie Sie denselben Objektkonstruktionscode wiederverwenden können, wenn Sie verschiedene Produkttypen, z. B. Autos, erstellen und die entsprechenden Handbücher für sie erstellen. Eine Regieklasse in Ihrem Programm ist nicht unbedingt erforderlich. Sie können die Bauschritte jederzeit in einer bestimmten Reihenfolge direkt aus dem Clientcode aufrufen. Die Director-Klasse könnte jedoch ein guter Ort sein, um verschiedene Konstruktionsroutinen zu platzieren, damit Sie sie im gesamten Programm wiederverwenden können. Das Factorymethodenmuster basiert auf vererbung, da die Objekterstellung an Unterklassen delegiert wird, die die Factorymethode zum Erstellen von Objekten implementieren. [3] Der Client muss einem der Builder-Objekte einen zugeordnet. Normalerweise geschieht dies nur einmal über Parameter des Konstruktors des Regisseurs. Dann verwendet der Direktor dieses Bauobjekt für alle weiteren Konstruktionen.

Es gibt jedoch einen alternativen Ansatz, wenn der Client das Builderobjekt an die Produktionsmethode des Regisseurs übergibt. In diesem Fall können Sie jedes Mal einen anderen Builder verwenden, wenn Sie etwas mit dem Regisseur erstellen. Während die Domänenmodellklasse selbst unveränderlich ist und daher über endgültige Felder verfügt. Alle Felder im Builder sind nach Vorhaben nicht endgültig. Daher sind Builders nicht threadsicher. Also nicht wiederverwenden Builders; erstellen Sie stattdessen eine neue Instanz für jeden Test. Einige der Konstruktionsschritte erfordern möglicherweise eine andere Implementierung, wenn Sie verschiedene Darstellungen des Produkts erstellen müssen. Zum Beispiel können Wände einer Hütte aus Holz gebaut werden, aber die Burgmauern müssen mit Stein gebaut werden. Obwohl dies funktionieren wird, haben wir ein fehlerhaftes Design.

Was wir hier angewendet haben, ist das Teleskopkonstruktormuster, das als Anti-Muster betrachtet wird. Obwohl dieses Muster für die einfache Objekterstellung mit einer begrenzten Anzahl von Feldern funktioniert, wird es für die komplexe Objekterstellung nicht mehr verwaltet. Stellen Sie sich die Anzahl der Konstrukteure vor, die Sie benötigen, um ein komplexeres Haus mit Optionen für Sanitär, Blitze, Innenräume usw. zu erstellen. Ein weiteres großes Problem in diesem Entwurf hängt mit Konstruktoraufrufen zusammen, die Clients erstellen müssen.