Schöpfungsmuster: Erbauer

Dec 04 2022
In diesem Artikel wird erläutert, wie komplexe Objekte dargestellt und konstruiert werden können, ohne die beiden Operationen zu koppeln. Was ist es? Das Builder-Muster reduziert die Codemenge, die zum Erstellen von Objekten erforderlich ist.

In diesem Artikel wird erläutert, wie komplexe Objekte dargestellt und konstruiert werden können, ohne die beiden Operationen zu koppeln.

Was ist es?

Das Builder-Muster reduziert die Codemenge, die zum Erstellen von Objekten erforderlich ist. Wenn Sie also etwas Komplexes zu erstellen haben, können Sie diesen Prozess mithilfe des Builder-Musters vereinfachen. Ein zusammengesetztes oder aggregiertes Objekt ist das, was ein Erbauer im Allgemeinen herstellt.

Das Builder-Muster kapselt den Prozess des Erstellens eines komplexen Objekts und trennt seine Darstellung von seiner Konstruktion. Dies ermöglicht es uns, verschiedene Modelle mit demselben Konstruktionsprozess zu erstellen. In der Java-Sprache bedeutet dies, Objekte anderer Klassen zu erstellen, die denselben Konstruktionsprozess teilen können.

Klassen Diagramm

Das Klassendiagramm enthält die folgenden Entitäten:

  • Baumeister
  • Betonbauer
  • Direktor
  • Produkt

Um mit unserem Beispiel von Flugzeugen fortzufahren, nehmen wir an, dass der Bau eines Flugzeugs drei Schritte umfasst:

  1. die Herstellung des Cockpits
  2. dann der Motor
  3. und schließlich die Flügel

Schauen wir uns jetzt den Code an. Zuerst beginnen wir mit der abstrakten Schnittstelle für unsere AircraftBuilderKlasse. Als nächstes enthält jeder Builder Methoden, die von konkreten Buildern überschrieben werden können, je nachdem, ob sie diesen Teil in die endgültige Produktvariante aufnehmen, für deren Erstellung sie verantwortlich sind.

Jetzt implementieren wir zwei Betonbauer, einen für F-16 und einen für Boeing-747.

Der Einfachheit halber haben wir das Skelett der Builder bereitgestellt und die individuelle Implementierung jeder Methode übersprungen. Es F16Buildersetzt die Methode nicht außer Kraft, buildBathroomsda es im F-16-Cockpit keine Badezimmer gibt. Der Schöpfer der Boeing 747 überschreibt die Badezimmermethode, da eine Boeing 747 Badezimmer für Passagiere hat.

Die DirectorKlasse ist dafür verantwortlich, den Prozess oder Algorithmus aufzuzeichnen, der zum Erstellen eines Flugzeugs erforderlich ist, z. B. die spezifische Reihenfolge, in der verschiedene Teile hergestellt werden. Der Regisseur ist wie ein Flugzeugbauer. Das fertige Produkt wird ihm von den Bauherren zurückgegeben.

Beachten Sie, dass wir den Hersteller unserer Wahl eingeben und das Flugzeugprodukt (Darstellung) so ändern können, dass es entweder eine F-16 oder eine Boeing-747 ist. In unserem Szenario geben die Builder unterschiedliche Supertypen zurück, aber dies ist möglicherweise nicht der Fall, wenn sie Produkte zurückgeben, die nicht sehr ähnlich sind.

Der Client wendet das Muster auf diese Weise an:

Die AircraftBuilderSchnittstelle verbirgt, wie ein Flugzeug gebaut wird. Der Client kennt die Klassen nicht F16Engine, F16Cockpitdie zum Erstellen von Boeing-747 verwendet werden.

Den Direktor überspringen

Das Builder-Muster wird oft ohne den Director verwendet. Stattdessen kann der Client den Builder direkt instanziieren und die erforderlichen Methoden aufrufen, um ein Produkt für sich selbst zu erhalten. Dies ist ein gängiges Gegenmittel für Teleskopbauer. Stellen Sie sich beispielsweise eine Klasse mit zu vielen Attributen vor, von denen einige jedoch als optional festgelegt werden können. In einem solchen Fall können Sie den Builder nur aufrufen, um die erforderlichen Attribute festzulegen und ein Produkt zu erstellen.

Andere Beispiele

  • Die Java-API stellt eine StringBuilderKlasse bereit, die nicht strikt dem GoF-Builder-Muster entspricht, aber dennoch als Beispiel dafür angesehen werden kann. Die StringBuilder-Klasse stellt eine Append-Methode bereit, die eine neue Zeichenfolge zurückgibt, indem sie Zeichen aus der ursprünglichen Zeichenfolge anfügt.
  • Ein weiteres hypothetisches Beispiel könnte das Erstellen von Dokumenten des Typs PDF oder HTML sein.

Die obige Methode kann in einem Client- oder Servercode erscheinen, und verschiedene Dokumenttypen können erstellt werden, indem ein different DocumentBuilderan die Methode übergeben wird. HtmlDocumentBuilderWir könnten a und a PdfDocumentBuildervon der abstrakten Klasse ableiten DocumentBuilder.

Vorbehalte

Die Builder- und Abstract-Factory-Patterns haben ähnliche Ziele, gehen sie aber unterschiedlich an. Beispielsweise erstellt das Builder-Muster Objekte Schritt für Schritt, während die abstrakte Fabrik ein Objekt auf einmal zurückgibt.

Weitere Artikel in der Creational Pattern-Reihe