Builder -Modus
Definition wird auch als Generatormuster bezeichnet. Es kann den Konstruktionsprozess komplexer Objekte (abstrakte Kategorien) abstrahieren, damit verschiedene Implementierungsmethoden dieses abstrakten Prozesses Objekte mit unterschiedlichen Manifestationen (Attribute) konstruieren können.
Wenn ein Algorithmus zum Erstellen eines komplexen Objekts unabhängig von den Komponenten dieses Objekts sein sollte, muss der Konstruktionsprozess das konstruierte Objekt unterschiedliche Darstellungen haben. Wir könnten den Baumodus verwenden.
erreichen
1. Builder gibt eine abstrakte Schnittstelle für jede Komponente an, die ein Produktobjekt erstellt. Normalerweise enthält es abstrakte Methoden, die Produkte erstellen und zurückgeben, oder kann eine konkrete Methode sein, die den Erstellungsprozess in die Betonbuilder -Klasse einbringt.
2. Concretebuilder implementiert die Builder -Schnittstelle, um verschiedene Komponenten des Produkts zu konstruieren und zusammenzustellen.
3. Direktor ist dafür verantwortlich, den entsprechenden Bauunternehmer zur Bildung des Produkts zu rufen. Die Direktorklasse hängt im Allgemeinen nicht von der Produktklasse ab. Die Builder -Klasse interagiert direkt mit der Director -Klasse.
4. Produkt stellt ein komplexes Objekt dar, das konstruiert werden soll. Concreatebuilder erstellt eine interne Darstellung des Produkts und definiert seinen Montageprozess.
/ ** "Produkt"*/ Klasse Pizza {private String dough = ""; private String sauce = ""; private String topping = ""; public void setdough (String -Teig) {this.dough = teig; } public void setSauce (String -Sauce) {this.sauce = sauce; } public void s werden (String Topping) {this.topping = topping; }} ''/** "Abstract Builder"*/'' abstrakter Klasse Pizzabuilder {Protected Pizza Pizza; public pizza getPizza () {return pizza; } public void createNewpizzAproduct () {Pizza = new pizza (); } public abstract void Builddough (); öffentliche abstrakte Leere Buildsauce (); öffentliche abstrakte void Buildtopping (); } / ** "Concretebuilder"* / Class HawaiianPizzabuilder erweitert Pizzabuilder {public void Builddough () {Pizza.setdough ("Cross"); } public void Buildsauce () {pizza.setsauce ("mild"); } public void Buildtopping () {Pizza.Settopping ("Schinken+Ananas"); }} / ** "Concretebuilder"* / class Spicypizzabuilder erweitert Pizzabuilder {public void Builddough () {Pizza.setdough ("Pan Baked"); } public void Buildsauce () {Pizza.Setsauce ("Hot"); } public void Buildtopping () {Pizza.Settopping ("Pepperoni+Salami"); }} ''/** "Director"*/'' Klasse Kellner {privater Pizzabuilder Pizzabuilder; public void setpizzabuilder (Pizzabuilder pb) {Pizzabuilder = pb; } public pizza getPizza () {return pizzabuilder.getPizza (); } public void constructpizza () {Pizzabuilder.CreateNewpizzAProduct (); Pizzabuilder.builddough (); pizzabuilder.buildsauce (); pizzabuilder.buildtopping (); }} /** Ein Kunde bestellt eine Pizza. */ class bustenexample {public static void main (String [] args) {waiter waiter = new Waiter (); Pizzabuilder Hawaiian_pizzabuilder = New Hawaiianpizzabuilder (); Pizzabuilder Spicy_Pizzabuilder = New Spicypizzabuilder (); Wader.SetPizzabuilder (Hawaiian_pizzabuilder); Kellner.ConstructPizza (); Pizza pizza = wader.getPizza (); }}Der Client erstellt das Director -Objekt und konfiguriert es mit dem Builder -Objekt, das er möchte. Director erhält die Anfrage des Kunden, das Produkt zu erstellen, und schließlich das Produkt.
Vorteil
1. Der Prozess der Konstruktion von Objekten kann sorgfältig gesteuert werden, um verschiedene Produktobjekte zu erzeugen.
2. leicht zu erweitern. Wenn es ein neues Produkt gibt, können Sie einfach einen neuen Betonbauer hinzufügen, um es zu erreichen.
Das verwandte Muster abstrakte Werksmuster ähnelt den Generatoren, da es auch komplexe Objekte erzeugen kann. Der Hauptunterschied besteht darin, dass sich das Generatormuster Schritt für Schritt auf die Konstruktion eines komplexen Objekts konzentriert. Das abstrakte Fabrikmodell konzentriert sich auf mehrere Reihe von Produktobjekten (einfach oder komplex).
Der Generator gibt das Produkt im letzten Schritt zurück und für die abstrakte Fabrik kehrt das Produkt sofort zurück.
Prototypmodus
Das Definieren eines Prototyp -Musters ist eine Art Erstellungsmuster, das durch "Kopieren" einer vorhandenen Instanz gekennzeichnet ist, um eine neue Instanz zurückzugeben, anstatt eine neue Instanz zu erstellen. Das kopierte Beispiel ist das, was wir als "Prototyp" nennen, das anpassbar ist.
Der Prototypmodus wird hauptsächlich verwendet, um komplexe oder zeitaufwändige Instanzen zu erstellen, da in diesem Fall das Kopieren einer vorhandenen Instanz das Programm effizienter ausgeführt wird. oder erstellen gleiche Werte, nur verschiedene ähnliche Daten.
erreichen
1. Client - Erstellen Sie ein neues Objekt und erhalten Sie dann ein anderes Objekt über Klon.
2. Prototyp - Definieren Sie die eigene abstrakte Methode eines Klons.
3.. Concreteprototype - Klonmethode implementieren.
public interface Prototype {public abstract Object Clone (); } public class ConcretePrototype implementiert Prototyp {public Object Clone () {return Super.clone (); }} public class Client {public static void main (string arg []) {concretePrototyp obj1 = new ConcreteProtype (); Konkreteprototype obj2 = konkretprototyp) obj1.clone (); }} Beispiel
1. Viele Elemente im Spiel werden wiederholt, und wir können den Prototypenmodus verwenden, um dieselben Elemente zu kopieren.
2. Beim Erstellen von Datendiagrammen müssen wir zum ersten Mal Daten aus der Datenbank lesen und in das Objekt speichern. Wenn wir andere Diagramme derselben Daten erstellen müssen, kann die Verwendung des Prototypmodus die Datenbank unter Verwendung eines erneuten Lesens vermeiden.
Verwandte Fragen und Implementierungen
1. Wenn die Anzahl der zu erstellenden Prototypen nicht festgelegt ist, können Sie einen Prototyp -Manager erstellen. Vor dem Kopieren des Prototyp -Objekts prüft der Client zunächst, ob es Prototypobjekte gibt, die die Bedingungen im Prototyp -Manager erfüllen. Wenn dies der Fall ist, wird es direkt verwendet. Wenn nicht, klonen Sie einen. Dies wird als Registrierungsform des Prototyp -Modus bezeichnet.
2. Es gibt zwei Arten des Kopierens: Deep Copy und Shallow Copy. Beim Kopieren teilen sich das Kopierobjekt und das Prototyp -Objekt alle internen Variablen des Objekts, und die beiden Objekte haben den gleichen Speicherraum und denselben Lebenszyklus. Die Änderung des Prototypobjekts modifiziert auch seine Replik und umgekehrt.
In Java können Sie, solange Sie die klonbare Schnittstelle implementieren, die Klonmethode der Objektklasse aufrufen, um ein flaches Kopieren zu erreichen:
öffentliche Klasse Shallowclone implementiert klonbares {int älter; Person; public void setage (int ay) {this.age = älter; } public void setPerson (String -Name) {Person = New Person (Name); } public Object Clone () löscht ClonenotsUsPorteedException {// Die Standard -Java implementiert flache Kopie return Super.clone (); }} öffentliche Klasse Person {String Name; public person (String name) {this.name = name; }} public class test {public static void main (String [] args) löst ClonenotsupportedException {ShallowClone OldSlowclone = new Shallowclone () aus; OldShowClone.Setage (20); OldShallon.setperson ("Eric"); System.out.println ("Oldname:" + oldShallowclone.person.name + "Alter:" + oldShallowclone.age); Shallowclone NewShallowClone = (Shallowclone) OldSallowclone.clone (); System.out.println ("NewName:" + newShallaClone.person.name + "Alter:" + newsallowclone.age); oldShallowclone.age = 30; OldShallowclone.person.name = "Frank"; System.out.println ("NewName:" + newShallaClone.person.name + "Alter:" + newsallowclone.age); }} Ausgabe:
Oldname: Eric Age: 20Newname: Eric Age: 20Newname: Frank Age: 20
Es ist ersichtlich, dass das Kopieren des Objekts ein Hinweis auf das Objekt ist. Wenn der Wert des Objekts geändert wird, ändert sich auch das kopierte Objekt und der Grundtyp von Java ist der kopierte Wert.
Im Folgenden implementieren wir eine tiefe Kopie:
öffentliche Klasse Deepclone {int ay; Person; public void setage (int ay) {this.age = älter; } public void setPerson (String -Name) {Person = New Person (Name); } public DeepClone (Deepclone Deepclone) {this.age = DeepClone.age; this.person = new Person (Deepclone.person.name); } public DeepClone () {} public Object Clone () löst ClonenotsupportedException {return New DeepClone zurück (this); }} public class test {public static void main (String [] args) löst ClonenotsupportedException {DeepClone OldDeepclone = new Deepclone () aus; OldDeepClone.Setage (20); OldDeepclone.setperson ("Eric"); System.out.println ("Oldname:" + olddeepclone.person.name + "Alter:" + olddeepclone.age); DeepClone NewDeepClone = (DeepClone) OldDeepclone.clone (); System.out.println ("NewName:" + newdeepclone.person.name + "Alter:" + newDeepclone.age); oldDeepclone.age = 30; olddeepclone.person.name = "Frank"; System.out.println ("NewName:" + newdeepclone.person.name + "Alter:" + newDeepclone.age); }} Ausgabe:
Oldname: Eric Age: 20Newname: Eric Age: 20Newname: Eric Age: 20
In der obigen Kopiermethode haben wir ein Objekt nachgebildet und den Verweis zur Implementierung von Deep Copy nachgebildet.
Vorteil
1. Kopieren ist besser als neu.
2. Vereinfachen oder ausblenden Sie die Details zum Erstellen von Objekten und kopieren Sie sie direkt.