Muster der Vorlagenmethode erstellt ein Verarbeitungsframework auf der Oberklassenseite und konkretisiert die spezifische Verarbeitung auf der Unterklassenseite. Das Factory-Methodenmuster ist eine Anwendung dieses Musters auf die Instanziierungsszene.
Eine abstrakte Klasse, die die Schnittstelle definiert, die eine von diesem Muster generierte Instanz haben sollte. Der spezifische Inhalt wird durch die Rolle des Betonprodukts bestimmt.
package factoryMethod;
public abstract class Product {
public abstract void use();
}
Eine abstrakte Klasse, die eine Produktrolle erstellt. Der spezifische Inhalt wird von Contrete Creator festgelegt. Die Erstellerrolle weiß nichts über die Rolle des konkreten Produkts, die sie tatsächlich erstellt. Die Ersteller-Rolle weiß nur, dass das Produkt erstellt wird, wenn Sie die Produktrolle und die Instanziierungsmethode aufrufen. Durch Ersetzen der tatsächlichen Instanziierung durch new durch den Methodenaufruf zur Instanziierung wird die Oberklasse durch den konkreten Klassennamen von der Bindung befreit.
package factoryMethod;
public abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
Bestimmte Produkte bestimmen.
package factoryMethod;
public class IdCard extends Product {
private String owner;
public IdCard(String owner) {
System.out.println(owner + "Eine Karte machen");
this.owner = owner;
}
@Override
public void use() {
System.out.println(owner + "Verwenden Sie die Karte");
}
public String getOwner() {
return owner;
}
}
Definieren Sie eine Klasse, um ein bestimmtes Produkt herzustellen.
package factoryMethod;
import java.util.ArrayList;
import java.util.List;
public class IdCardFactory extends Factory {
private List<String> owners = new ArrayList<>();
@Override
protected Product createProduct(String owner) {
return new IdCard(owner);
}
@Override
protected void registerProduct(Product product) {
owners.add(((IdCard)product).getOwner());
}
public List<String> getOwners() {
return owners;
}
}
package factoryMethod;
public class Main {
public static void main(String[] args) {
Factory factory = new IdCardFactory();
Product card1 = factory.create("Tanaka");
Product card2 = factory.create("Suzuki");
Product card3 = factory.create("Sato");
card1.use();
card2.use();
card3.use();
}
}
//Ausführungsergebnis
//Machen Sie eine Tanaka-Karte
//Machen Sie eine Suzuki-Karte
//Mach Satos Karte
//Ich werde Tanakas Karte benutzen
//Ich werde Suzukis Karte benutzen
//Ich werde Satos Karte benutzen
Der obigen IdCard-Klasse wurde eine Seriennummer hinzugefügt, und die IdCardFactory-Klasse wurde so geändert, dass eine Entsprechungstabelle zwischen der Seriennummer und dem Eigentümer vorhanden war.
package factoryMethod;
public class IdCard extends Product {
private String owner;
private int serial;
public IdCard(String owner, int serial) {
System.out.println(owner + "(" + serial + ")Eine Karte machen");
this.owner = owner;
this.serial = serial;
}
@Override
public void use() {
System.out.println(owner + "(" + serial + ")Verwenden Sie die Karte");
}
public String getOwner() {
return owner;
}
public int getSerial() {
return serial;
}
}
package factoryMethod;
import java.util.HashMap;
public class IdCardFactory extends Factory {
private HashMap<Integer, String> database = new HashMap<>();
private int serial = 1;
@Override
protected synchronized Product createProduct(String owner) {
return new IdCard(owner, serial++);
}
@Override
protected void registerProduct(Product product) {
IdCard card = (IdCard)product;
database.put(card.getSerial(), card.getOwner());
}
public HashMap<Integer, String> getDatabase() {
return database;
}
}
package factoryMethod;
public class Main {
public static void main(String[] args) {
Factory factory = new IdCardFactory();
Product card1 = factory.create("Tanaka");
Product card2 = factory.create("Suzuki");
Product card3 = factory.create("Sato");
card1.use();
card2.use();
card3.use();
}
}
//Ausführungsergebnis
//Tanaka(1)Eine Karte machen
//Suzuki(2)Eine Karte machen
//Sato(3)Eine Karte machen
//Tanaka(1)Verwenden Sie die Karte
//Suzuki(2)Verwenden Sie die Karte
//Sato(3)Verwenden Sie die Karte
Ich konnte Änderungen vornehmen, ohne die Produktklasse, die Factory-Klasse und die Hauptklasse zu ändern.
Recommended Posts