Builder: Trennen Sie die Konstruktion eines komplexen Objekts von seiner Darstellung, damit der gleiche Konstruktionsprozess unterschiedliche Darstellungen erzeugen kann.
Szenarien verwenden:
Allgemeines Klassendiagramm:
Zum Beispiel: Es gibt viele Geräte in unserem Leben in Montageform, wie z. B. Desktop -Computer. Einige Hersteller starten einige zusammengestellte Computerhosts mit Standardkonfigurationen (der Vorlagenmethodenmodus kann hier verwendet werden). Kunden können Produkte mit Standardkonfigurationen kaufen oder die Hersteller bitten, einen Host mit unterschiedlichen Konfigurationen und Montagemethoden wieder zusammenzustellen. Zu diesem Zeitpunkt können wir das Builder -Modell verwenden, um die Anforderungen spezieller Kunden zu erfüllen.
Beachten Sie, dass der Hersteller in diesem Beispiel einen Host zusammenbaut, dh der Fokus auf jeder Komponente des Hosts, die dem Verwendungsszenario entspricht, der im obigen Builder -Modus angegeben ist.
Die einfache Code -Implementierung ist wie folgt:
// Zusammenfassung Produktklasse unter Verwendung des Vorlagenmethodenmodus haben verschiedene Produkte unterschiedliche "Komponententeil" -Incomputer -Klasse. geschützte abstrakte void part02 (); geschützte abstrakte void part03 (); // Vorlagenmethode gibt die Standard -Assemblermethode an, wodurch das Standardprodukt Public Final AbstractProduct DefaultProduct () {part01 () generiert wird; Teil02 (); Teil03 (); Geben Sie dies zurück; // Rückgabe des aktuellen Objekts, dh das Produkt mit der Standard -Assembly -Methode}} // Spezifische Produkte A und B, verschiedene Produkte implementieren unterschiedliche "Komponententeil" -Klasse -ConcreTeProducta erweitert AbstractProduct {Protected void part01 () {System.out.println ("Produkt a: part01 () ..."); } protected void part02 () {System.out.println ("Produkt a: part02 () ..."); } protected void part03 () {System.out.println ("Produkt a: part03 () ..."); }} Klasse ConcreteProductB erweitert AbstractProduct {Protected void part01 () {System.out.println ("Produkt b: part01 () ..."); } protected void part02 () {System.out.println ("Produkt b: part02 () ..."); } protected void part03 () {System.out.println ("Produkt b: part03 () ..."); }} // abstrakter Builder formuliert die Kombinationsmethode, dass jedes Produkt BuildPart () und Standard zur Herstellung von BuildProduct () Abstract Class AbstractBuilder {public abstract void buildPart () implementiert; öffentliches abstraktes AbstractProduct BuildProduct (); } / * * Wenn der spezifische Builder mit dem Standardprodukt nicht zufrieden ist (d. H. Wenn die Standardprodukt () im abstrakten Produkt genannt wird), können Sie es nicht nennen, um das Produkt zu erhalten, sondern verwenden Sie den spezifischen Bauherr, um die Produktions- und Assemblermethode des Produkts zu ändern. public void BuildPart () {this.producta.Part03 (); this.Producta.Part02 (); this.Producta.Part01 (); } public AbstractProduct BuildProduct () {return this.producta; }} class ConcretebuilderB erweitert AbstractBuilder {private AbstractProduct productB = new ConcreteProductB (); public void BuildPart () {this.ProductB.Part02 (); this.ProductB.Part01 (); // Eine Komponente in Produkt B wird weggelassen, beispielsweise werden die Funktionen dieses Teils von den Kunden nicht benötigt // this.Productb.Part03 (); } public AbstractProduct BuildProduct () {return this.productb; }} // Director-Klasse, der Builder, der jedes Produkt vornimmt, bietet verschiedene Montagemethoden für Benutzer, die unterschiedliche Produkte benötigen als der Standard-Produktklassendirektor {private commuscessBuilder Builda = new Concretebuildera (); private AbstractBuilder BuildB = New ConcretebuilderB (); public abstractProduct getProducta () {this.buildera.buildPart (); return this.buildera.buildProduct (); } public AbstractProduct getProductB () {this.builderb.buildPart (); return this.builderb.buildProduct (); }} // Klasse public class Client {public static void main (String [] args) {System.out.println ("Vorlagenmethode verwenden, um das Standardprodukt A zu erhalten a"); AbstractProduct DefaultProducta = new ConcreteProducta (). DefaultProduct (); System.out.println ("/Nuse Director -Klasse, um Produkt A mit unterschiedlichen Montagemethoden zu erhalten"); Direktor Director = New Director (); Director.getProducta (); System.out.println ("/Nuse Director -Klasse, um Produkt B mit unterschiedlichen Montagemethoden zu erhalten"); Director.getProductb (); }} Testergebnisse:
Verwenden Sie den Vorlagenmethodenmodus, um das Standardprodukt a zu erhalten
Produkt A: Teil01 () ...
Produkt A: Teil02 () ...
Produkt A: Teil03 () ...
Verwenden Sie die Director -Klasse, um Produkte mit unterschiedlichen Montagemethoden zu erhalten a
Produkt A: Teil03 () ...
Produkt A: Teil02 () ...
Produkt A: Teil01 () ...
Verwenden Sie die Director -Klasse, um Produkt B mit unterschiedlichen Montagemethoden zu erhalten
Produkt B: Teil02 () ...
Produkt B: part01 () ...
In diesem Beispiel verwendet die Produktkategorie den im vorherigen Artikel genannten Vorlagenmethodenmodus, dh defaultProduct () eine Methode zur Zusammenstellung einer Standardkomponente des Produkts.
Aber ich habe hier eine Frage. Die in der AbstractProduct-Klasse bereitgestellte sogenannte Standard-Assemblierungsmethode basierend auf dem Vorlagenmethodenmuster besteht nur darin, ein paar Testsätze auszudrucken, und gibt ein bestimmtes Produkt nicht wirklich zurück. Ich weiß jedoch nicht, ob die Verarbeitungsmethode zur Rückgabe eines aktuellen Objekts (zurückgeben;) im obigen Beispiel angemessen ist?
Nachdem ich diese Artikel über die Implementierung von Designmustern mit Java -Code geschrieben hatte, stellte ich außerdem fest, dass dieses Muster für Builder Builder das Muster des abstrakten Werksmusters und des Vorlagenmethodes zu kombinieren scheint. Der obige Absatz hat bereits meine Zweifel erwähnt. Was das abstrakte Fabrikmodell angeht, denke ich persönlich, dass die Direktorklasse im obigen Codebeispiel der spezifischen Fabrikklasse der abstrakten Fabrik sehr ähnlich ist, aber die Direktor -Klasse muss auch die Produktmontagemethode erstellen, bevor ein Produkt zurückgegeben wird. Vielleicht ist es dieses "Build", das das Bauherrenmodell auf die Montage verschiedener Teile des Produkts konzentriert, während sich das abstrakte Fabrikmodell nur auf die Erzeugung eines Endprodukts konzentriert.
Ich habe bereits einen Satz gelesen und gesagt, dass es grob gesagt wird: Wenn ein Computerproblem schwer zu lösen ist, kann er durch Hinzufügen einer Zwischenschicht behandelt werden. Jetzt, da ich darüber nachdenke, scheint es, dass sowohl die abstrakte Fabrik als auch der Builder -Modus dieses "Prinzip" verwenden, um den gewünschten Effekt zu erzielen. Zum Beispiel gibt es eine abstrakte Fabrikklasse in abstrakter Fabrik, und es gibt eine Direktor -Klasse im Builder. Letztendlich soll bestimmte Details einkapseln und ausblenden und aus der Implementierung und Verwendung entkoppeln.
Ich denke, Sie müssen zunächst die Bedenken und anwendbaren Szenarien jedes Modells verstehen, bevor Sie diese besser verstehen können.
Vielleicht sind diese Modi alles kreative Modi, und ich habe keine praktische Erfahrung, was mich ein wenig verwirrt über diese macht ... Ich habe keine Angst, ein wenig darüber nachzudenken, sie alle implementieren und langsam auf die Realität anwenden sollte.
Das obige dreht sich alles um diesen Artikel, und ich hoffe, es wird Sie zum Lernen inspirieren.