[JAVA] Modèle de conception ~ Usine abstraite ~

1.Tout d'abord

Voici un résumé du ** modèle Abstract Factory ** dans le modèle de conception GoF.

2. Quel est le modèle Abstract Factory?

--Abstract Factory signifie ** Abstract Factory **. ――Abstract est un état dans lequel vous vous concentrez uniquement sur l'interface sans penser à la façon dont elle est implémentée.

3. Exemple de diagramme de classes

AbstractFactory.PNG

4. Exemple de programme

Un programme qui génère une liste de favoris au format HTML.

4-1. Classe d'usine

Une classe qui représente une fabrique abstraite. Créer un lien, un plateau, une page.

Factory.java


package factory;

public abstract class Factory {

	public abstract Link createLink(String caption, String url);
	public abstract Tray createTray(String caption);
	public abstract Page createPage(String title);

	public static Factory getFactory(String classname) {
		Factory factory = null;
		try {
			factory = (Factory) Class.forName(classname).newInstance();
		} catch (ClassNotFoundException e) {
			System.err.println("classe" + classname + "Ne peut être trouvé.");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return factory;
	}
}

4-2. Classe d'objets

Cette classe gère Link et Tray de manière unifiée.

Item.java


package factory;

public abstract class Item {
	protected String caption;

	public Item(String caption) {
		this.caption = caption;
	}

	public abstract String makeHTML();
}

4-3. Classe de lien

Partie abstraite: une classe qui représente un lien HTML.

Link.java


package factory;

public abstract class Link extends Item {
	protected String url;

	public Link(String caption, String url) {
		super(caption);
		this.url = url;
	}
}

4-4. Classe de bac

Parties abstraites: Une classe de liens et de plateau.

Tray.java


package factory;

import java.util.ArrayList;

public abstract class Tray extends Item {
	protected ArrayList tray = new ArrayList();

	public Tray(String caption) {
		super(caption);
	}

	public void add(Item item) {
		tray.add(item);
	}
}

4-5. Classe de page

Partie abstraite: une classe qui représente une page HTML.

Page.java


package factory;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;

public abstract class Page {
	protected String title;
	protected ArrayList content = new ArrayList();

	public Page(String title) {
		this.title = title;
	}

	public void add(Item item) {
		content.add(item);
	}

	public void output() {
		try {
			String filename = title + ".html";
			Writer writer = new FileWriter(filename);
			writer.write(this.makeHTML());
			writer.close();
			System.out.println(filename + "est créé.");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public abstract String makeHTML();
}

4-6. Classe ListFactory

Cette classe représente une usine spécifique. Créez ListLink, ListTray, ListPage.

ListFactory.java


package listfactory;

import factory.Factory;
import factory.Link;
import factory.Page;
import factory.Tray;

public class ListFactory extends Factory {
	public Link createLink(String caption, String url) {
		return new ListLink(caption, url);
	}

	public Tray createTray(String caption) {
		return new ListTray(caption);
	}

	public Page createPage(String title) {
		return new ListPage(title);
	}
}

4-7. Classe ListLink

Partie spécifique: une classe qui représente un lien HTML.

ListLink.java


package listfactory;

import factory.Link;

public class ListLink extends Link {
	public ListLink(String caption, String url) {
		super(caption, url);
	}

	public String makeHTML() {
		return "  <li><a href=\"" + url + "\">" + caption + "</a></li>\n";
	}
}

4-8. Classe ListTray

Parties spécifiques: Une classe qui rassemble les liens et le plateau.

ListTray.java


package listfactory;

import java.util.Iterator;

import factory.Item;
import factory.Tray;

public class ListTray extends Tray {
	public ListTray(String caption) {
		super(caption);
	}

	public String makeHTML() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("<li>\n");
		buffer.append(caption + "\n");
		buffer.append("<ul>\n");
		Iterator it = tray.iterator();
		while (it.hasNext()) {
			Item item = (Item) it.next();
			buffer.append(item.makeHTML());
		}
		buffer.append("</ul>\n");
		buffer.append("</li>\n");
		return buffer.toString();
	}
}

4-9. Classe ListPage

Partie spécifique: une classe qui représente une page HTML.

ListPage.java


package listfactory;

import java.util.Iterator;

import factory.Item;
import factory.Page;

public class ListPage extends Page {
	public ListPage(String title) {
		super(title);
	}

	public String makeHTML() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("<html><head><title>" + title + "</title></head>\n");
		buffer.append("<body>\n");
		buffer.append("<h1>" + title + "</h1>\n");
		buffer.append("<ul>\n");
		Iterator it = content.iterator();
		while (it.hasNext()) {
			Item item = (Item) it.next();
			buffer.append(item.makeHTML());
		}
		buffer.append("</ul>\n");
		buffer.append("</body></html>\n");
		return buffer.toString();
	}
}

4-10. Classe principale

Cette classe effectue le traitement principal.

Main.java


import factory.Factory;
import factory.Link;
import factory.Page;
import factory.Tray;

public class Main {
	public static void main(String[] args) {

		Factory factory = Factory.getFactory("listfactory.ListFactory");

		Link qiita = factory.createLink("Qiita", "https://qiita.com//");
		Link dot = factory.createLink("Dot installer", "https://dotinstall.com/");

		Link yahoo = factory.createLink("Yahoo!Japan", "http://www.yahoo.co.jp/");
		Link excite = factory.createLink("Excite", "http://www.excite.com/");
		Link google = factory.createLink("Google", "http://www.google.com/");

		Tray pgTray = factory.createTray("la programmation");
		pgTray.add(qiita);
		pgTray.add(dot);

		Tray searchTray = factory.createTray("Site de recherche");
		searchTray.add(yahoo);
		searchTray.add(excite);
		searchTray.add(google);

		Page page = factory.createPage("préféré");
		page.add(pgTray);
		page.add(searchTray);
		page.output();
	}
}

4-11. Résultat de l'exécution

キャプチャ.PNG

5. Avantages

Par exemple, si vous souhaitez ajouter une nouvelle fabrique concrète à l'exemple de programme, vous allez créer des sous-classes de Factory, Link, Tray et Page, et implémenter les méthodes abstraites pour chacune. En d'autres termes, il incarne simplement la partie abstraite de la classe de package d'usine. À l'heure actuelle, quel que soit le nombre d'usines de béton ajoutées, il n'est pas nécessaire de modifier l'usine abstraite.

  1. GitHub

7. Liste des modèles de conception

8. Référence

Cet article et exemple de programme ont été créés à partir des livres suivants.

C'était très facile à comprendre et j'ai beaucoup appris. Je vous remercie. Les explications détaillées des modèles de conception et des exemples de programmes sont écrites, veuillez donc également consulter les livres.

Recommended Posts

Modèle de conception ~ Usine abstraite ~
modèle d'usine abstrait
Modèle d'usine abstraite
Modèle de conception ~ Méthode d'usine ~
Introduction aux modèles de conception (Abstract Factory)
Modèle de conception Java pour débutant (modèle de méthode d'usine)
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
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 (2): constructeur
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Commande ~
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 conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de méthode d'usine
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Modèle de conception C ++ (modèle TemplateMethod)
Résumé du modèle de conception du GoF
Modèle de conception ~ Méthode de modèle ~
Résumé du modèle de conception Java
Avantages de la génération de modèles AbstractFactory avec enum
Modèle de conception ~ Chaîne de responsabilité ~
[Design pattern] Bibliothèque de base Java
Modèle de conception par la méthode Ruby Template Mémo de modèle
Introduction aux modèles de conception (méthode d'usine)
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle d'usine
Modèle de conception mâché C #: TemplateMethod
Exemple d'application du modèle de conception (n ° 1)
Quelle fabrique de modèles de stratégie, pas un état
[Modèle de conception] Logique commune avec la méthode de modèle