Builder-Muster
Das Builder-Muster ist ein Erzeugungsmuster, das es ermöglicht, die Schritte zur Erstellung eines komplexen Objekts von seiner Darstellung zu trennen.
Das Builder-Muster ist ein Erzeugungsmuster, dessen Hauptzweck darin besteht, den Konstruktionsprozess eines komplexen Objekts von seiner Darstellung zu trennen, sodass Objekte mit unterschiedlichen Darstellungen erstellt werden können.
summary
Absicht
Trennen Sie einen komplexen Konstruktionsprozess von seiner Darstellung, sodass derselbe Konstruktionsprozess unterschiedliche Darstellungen erzeugen kann.
Hauptsächlich gelöstes Problem
In Softwaresystemen besteht die Erstellung eines komplexen Objekts normalerweise aus mehreren Teilen; die Kombinationen dieser Teile ändern sich oft, aber der Kombinationsalgorithmus ist relativ stabil.
Wann verwenden
Wenn einige grundlegende Komponenten unverändert bleiben, sich ihre Kombinationen jedoch häufig ändern.
Lösung
Trenne die sich ändernden und die unveränderlichen Teile.
Schlüsselcode
- BuilderErzeuge und stelle eine Instanz bereit.
- director: Verwalte die Abhängigkeiten erzeugter Instanzen und steuere den Konstruktionsprozess.
Anwendungsbeispiel
- Bei KFC sind Hamburger, Cola, Pommes, frittierte Hähnchenflügel usw. unverändert, aber ihre Kombinationen ändern sich häufig, wodurch verschiedene "Combos" entstehen.
- In Java
StringBuilder。
Vorteile
- Die Trennung des Konstruktionsprozesses von der Repräsentation macht den Konstruktionsprozess flexibler und ermöglicht den Aufbau unterschiedlicher Repräsentationen.
- Es kann den Konstruktionsprozess besser steuern und spezifische Konstruktionsdetails verbergen.
- Hohe Wiederverwendbarkeit des Codes; derselbe Builder kann in verschiedenen Konstruktionsprozessen wiederverwendet werden.
Nachteile
- Wenn das Produkt nur wenige Attribute hat, kann das Builder-Muster zu Code-Redundanz führen.
- Erhöht die Anzahl der Klassen und Objekte im System.
Anwendungsfall
- Das zu erzeugende Objekt hat eine komplexe interne Struktur.
- Die internen Attribute des zu erzeugenden Objekts sind voneinander abhängig.
Hinweise
Der Unterschied zum Factory-Muster besteht darin, dass das Builder-Muster sich stärker auf die Reihenfolge der Teilemontage konzentriert.
Struktur
Das Builder-Muster umfasst die folgenden Hauptrollen:
Produkt: Das komplexe Objekt, das erstellt werden soll. Die Produktklasse enthält normalerweise mehrere Teile oder Attribute.
Abstrakter Builder: Definiert die abstrakte Schnittstelle zum Erstellen des Produkts, einschließlich Methoden zum Erstellen der verschiedenen Teile des Produkts.
Konkreter Builder: Implementiert die abstrakte Builder-Schnittstelle, legt konkret fest, wie die verschiedenen Teile des Produkts erstellt werden, und ist dafür verantwortlich, das fertig erstellte Produkt zurückzugeben.
Direktor: Verantwortlich für den Aufruf der Methoden des Builders zum Konstruieren des Produkts. Der Direktor versteht den spezifischen Konstruktionsprozess nicht, sondern kümmert sich nur um die Reihenfolge und Art der Produktkonstruktion.
Implementierung
Nehmen wir einen Geschäftsfall für ein Fast-Food-Restaurant an, bei dem ein typisches Menü aus einem Burger und einem Kaltgetränk bestehen kann. Der Burger kann ein Veg Burger oder ein Chicken Burger sein, und sie werden in einem Karton verpackt. Das Kaltgetränk kann Coca-Cola (coke) oder Pepsi (pepsi) sein, und sie sind in Flaschen.
Wir werden eine Entitätsklasse erstellen, die Lebensmittelartikel (wie Burger und Kaltgetränke) repräsentiert.ItemSchnittstelle und ImplementierungItemDie Entitätsklasse der Schnittstelle und eine Entitätsklasse, die Lebensmittelverpackungen repräsentiert.PackingSchnittstelle und ImplementierungPackingDie Entitätsklasse der Schnittstelle; Burger werden in Kartons verpackt und Kaltgetränke sind in Flaschen.
Dann erstellen wir eineMeal-Klasse, mit einerItem-ArrayListund einen, indem manItemkombiniert, um verschiedene Typen vonMealObjekt-MealBuilder zu erstellen。BuilderPatternDemoKlassenverwendungMealBuilderzum Erstellen einesMeal。
Schritt 1
Erstellen Sie eine Schnittstelle, die Lebensmittelartikel und Lebensmittelverpackung repräsentiert.
Item.java
Packing.java
Schritt 2
Erstellen Sie Entitätsklassen, die die Packing-Schnittstelle implementieren.
Wrapper.java
Bottle.java
Schritt 3
Erstelle eine abstrakte Klasse, die das Item-Interface implementiert und Standardfunktionalität bereitstellt.
Burger.java
ColdDrink.java
Schritt 4
Erstelle Entitätsklassen, die Burger und ColdDrink erweitern.
VegBurger.java
ChickenBurger.java
Coke.java
Pepsi.java
Schritt 5
Erstelle eine Meal-Klasse, die die oben definierten Item-Objekte enthält.
Meal.java
Schritt 6
Erstellen Sie eine MealBuilder-Klasse, die eigentliche Builder-Klasse, die für die Erstellung von Meal-Objekten verantwortlich ist.
MealBuilder.java
Schritt 7
BuiderPatternDemo verwendet MealBuilder, um das Builder-Muster zu demonstrieren.
BuilderPatternDemo.java
Schritt 8
Führen Sie das Programm aus, geben Sie das Ergebnis aus:
Veg Meal Item : Veg Burger, Packing : Wrapper, Price : 25.0 Item : Coke, Packing : Bottle, Price : 30.0 Total Cost: 55.0 Non-Veg Meal Item : Chicken Burger, Packing : Wrapper, Price : 50.5 Item : Pepsi, Packing : Bottle, Price : 35.0 Total Cost: 85.5