Il fait référence à un modèle dans lequel chaque partie qui compose le tout est fabriquée et assemblée étape par étape.
Le rôle Builder définit l'interface de création d'une instance. Le rôle Builer fournit des méthodes pour créer chaque partie de l'instance.
package builder2;
public abstract class Builder {
public abstract void makeTitle(String title);
public abstract void makeString(String str);
public abstract void makeItems(String[] items);
public abstract void close();
}
Le rôle ConcreteBuilder est une classe qui implémente l'interface du rôle Builder. La méthode appelée dans l'instanciation réelle est définie ici. De plus, une méthode est préparée pour obtenir le résultat final.
package builder2;
public class TextBuilder extends Builder {
private StringBuffer buffer = new StringBuffer();
@Override
public void makeTitle(String title) {
buffer.append("====================\n");
buffer.append("「" + title + "」\n");
buffer.append("\n");
}
@Override
public void makeString(String str) {
buffer.append('■' + str + "\n");
buffer.append("\n");
}
@Override
public void makeItems(String[] items) {
for (int i = 0; i < items.length; i++) {
buffer.append("・" + items[i] + "\n");
}
buffer.append("\n");
}
@Override
public void close() {
buffer.append("====================\n");
}
public String getResult() {
return buffer.toString();
}
}
package builder2;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class HtmlBuilder extends Builder {
private String fileName;
private PrintWriter writer;
@Override
public void makeTitle(String title) {
fileName = title + ".html";
try {
writer = new PrintWriter(new FileWriter(fileName));
} catch (IOException e) {
e.printStackTrace();
}
writer.println("<html><head><title>" + title + "</title></head></body>");
//Titre de la sortie
writer.println("<h1>" + title + "</h1>");
}
@Override
public void makeString(String str) {
writer.println("<p>" + str + "</p");
}
@Override
public void makeItems(String[] items) {
writer.println("<ul>");
for (int i = 0; i < items.length; i++) {
writer.println("<li>" + items[i] + "</li>");
}
writer.println("</ul>");
}
@Override
public void close() {
writer.println("</body></html>");
writer.close();
}
public String getResult() {
return fileName;
}
}
Le rôle Director crée une instance à l'aide de l'interface du rôle Builder. Ne programmez pas en fonction du rôle de ConcreteBuilder. Utilisez uniquement la méthode du rôle Builder pour qu'elle fonctionne quel que soit le rôle ConcreteBuilder.
package builder2;
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void construct() {
builder.makeTitle("Greeting");
builder.makeString("Du matin à midi");
builder.makeItems(new String[] {
"Bonjour.",
"Bonjour."
});
builder.makeString("La nuit");
builder.makeItems(new String[] {
"Bonsoir.",
"bonne nuit.",
"Au revoir."
});
builder.close();
}
}
Un rôle qui utilise le modèle Builder.
package builder2;
public class Main {
public static void main(String[] args) {
if (args.length != 1) {
usage();
System.exit(0);
}
if (args[0].equals("plain")) {
TextBuilder textBuilder = new TextBuilder();
Director director = new Director(textBuilder);
director.construct();
String result = textBuilder.getResult();
System.out.println(result);
} else if (args[0].equals("html")) {
HtmlBuilder htmlBuilder = new HtmlBuilder();
Director director = new Director(htmlBuilder);
director.construct();
String fileName = htmlBuilder.getResult();
System.out.println(fileName + "A été créé");
} else {
usage();
System.exit(0);
}
}
public static void usage() {
System.out.println("Usage:java Création de document brut principal avec du texte brut");
System.out.println("Usage:Création de document html principal java avec fichier HTML");
}
}
Dans ce programme, la classe Main ne connaît pas (n'appelle pas) la méthode de la classe Builder. La classe Main appelle uniquement la méthode Construct de la classe Director. Ensuite, la classe de directeur fonctionnera et le document sera terminé. Lorsque la classe Director fait le travail, la classe Main ne s'en soucie pas. D'autre part, la classe Director connaît la classe Builder. La classe Director utilise les méthodes de la classe Builder pour créer le document. Cependant, la classe Director ne sait pas quelle est la classe qu'elle utilise réellement. Vous n'avez pas besoin de savoir s'il s'agit de TextBuilder ou HtmlBuilder. Cela est dû au fait que la classe Director utilise uniquement les méthodes de la classe Builder et que les sous-classes de la classe Builder implémentent les méthodes. Il est possible de le remplacer car vous ne le connaissez pas. Il est très précieux en tant que pièce car il peut être remplacé.
https://github.com/aki0207/builder2
Je l'ai utilisé comme référence. Édition révisée augmentée Introduction aux modèles de conception appris en langage Java
Recommended Posts