[JAVA] Modèle de constructeur

Quel est le modèle Builder?

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 du constructeur

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 de Concrete Builder

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 du directeur

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();
	}
}

Le rôle du client

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");
	}
}

Résultats lors de l'utilisation de TextBuilder

スクリーンショット 2020-09-04 10.51.50.png

Résultats lors de l'utilisation de HtmlBuilder

スクリーンショット 2020-09-04 10.55.07.png

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

Modèle de constructeur
Modèle de constructeur
Modèle de conception ~ Constructeur ~
Modèle de conception (2): constructeur
Modèle de générateur (Java effectif)
Modèle de prototype
Motif de souvenir
Motif médiateur
Motif composite
Modèle d'observateur
Modèle de pont
Modèle de commande
Modèle de stratégie
Modèle d'itérateur
Modèle de visiteur
Modèle d'adaptateur
Modèle de proxy
Modèle de stratégie
Motif composite
Motif singleton
Motif singleton
Modèle de prototype
Modèle de façade
Motif décorateur
Modèle de poids mouche
Motif décorateur
Modèle de médiateur
Motif de façade
Modèle de visiteur
Modèle de pont
Modèle d'objet mère et modèle de générateur de données de test
modèle d'usine abstrait
[Java] Modèle de stratégie
Modèle de conception ~ Visiteur ~
Modèle de conception Java
modèle de rappel java
Modèle de générateur de données de test ~ Améliore la maintenabilité du code de test
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de méthode d'usine
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Singleton ~
Modèle de conception ~ Composite ~
Modèle de conception (1): AbstractFactory
[Java] Motif singleton
Modèle de conception ~ Commande ~
Modèle d'usine abstraite
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de méthode de modèle
Modèle de conception ~ Décorateur ~
Modèle de modèle de méthode
Modèle de conception ~ Interprète ~
Modèle de méthode d'usine
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
[Java] Modèle d'adaptateur
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~