Wenn eine gemeinsame Verarbeitung zwischen mehreren Instanzen erforderlich ist, verstecken Sie diese Verarbeitung Eine Implementierung, die dieselbe Verarbeitung, aber unterschiedliche interne Verarbeitung ermöglicht. Hier werden Japaner und Amerikaner basierend auf der People-Klasse erstellt, die ein Feld namens mainLanguage hat.
Erstellen Sie eine Schnittstelle, die die gemeinsame Verarbeitung mehrerer Instanzen definiert. (= Builder-Klasse)
Builder.java
public interface Builder {
void createMainLanguage(); //Stellen Sie die Hauptsprache ein
People getResult(); //People-Instanz zurückgeben
}
People.java
public class People {
//Gegenstand
private String mainLanguage;
public String getMainLanguage() {
return mainLanguage;
}
public void setMainLanguage(String mainLanguage) {
this.mainLanguage = mainLanguage;
}
void hello() {
System.out.println("Hallo. Die Hauptsprache ist" + mainLanguage);
}
}
Erstellen Sie eine Klasse mit einer Implementierung der definierten Schnittstelle. (= ConcreteBuilder-Klasse) ** Wenn die zu erstellenden Instanztypen zunehmen, generieren und erhöhen Sie diese Klasse **
JapaneseBuilder.java
//Japanischer Baumeister
public class JapaneseBuilder implements Builder {
private People people;
public JapaneseBuilder() {
this.people = new People();
}
@Override
public void createMainLanguage() {
people.setMainLanguage("Japanese"); //Japanisch ist die Hauptsprache
}
@Override
public People getResult() {
return this.people;
}
}
AmericanBuilder.java
//Amerikanischer Baumeister
public class AmericanBuilder implements Builder {
private People people;
public AmericanBuilder() {
this.people = new People();
}
@Override
public void createMainLanguage() {
people.setMainLanguage("English"); //Englisch ist die Hauptsprache
}
@Override
public People getResult() {
return this.people;
}
}
Erstellen Sie eine Klasse, die für die eigentliche Instanziierung verantwortlich ist. (= Regieklasse) ** * Stellen Sie sicher, dass die Schnittstelle ein Argument des Konstruktors ist ** Durch die Übergabe von Builder an Director wird es unabhängig von der ConcreteBuilder-Klasse. Mit anderen Worten, Director weiß nicht, was die eigentliche Klasse ConcreteBuilder ist.
Director.java
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public People construct() {
builder.createMainLanguage();
return builder.getResult();
}
}
(1) Erstellen Sie eine Builder-Instanz mit einer Builder-Schnittstelle als Typ. Die tatsächliche Verarbeitung hängt zum Zeitpunkt der Generierung von ConcreteBuilder ab. (2) Erstellen Sie eine Director-Instanz mit der Builder-Instanz als Argument.
Main.java
public class Main {
public static void main(String[] args) {
if (args[0].equals("Japanese")) {
//Generieren Sie einen japanischen Builder
Builder builder = new JapaneseBuilder();
//Director übergibt gerade die Bulder-Oberfläche, sodass er nicht einmal die interne Implementierung von Builder kennt.
Director director = new Director(builder);
People people = director.construct();
people.hello();
} else if (args[0].equals("English")) {
Builder builder = new AmericanBuilder();
Director director = new Director(builder);
People people = director.construct();
people.hello();
} else {
throw new IllegalArgumentException();
}
}
}
Recommended Posts