[JAVA] Entwurfsmuster ~ Abstrakte Fabrik ~

1. Zuallererst

Hier ist eine Zusammenfassung des ** Abstract Factory-Musters ** im GoF-Entwurfsmuster.

2. Was ist das Muster der abstrakten Fabrik?

--Abstract Factory bedeutet ** Abstract Factory **. ――Abstrakt ist ein Zustand, in dem Sie sich nur auf die Schnittstelle konzentrieren, ohne darüber nachzudenken, wie sie implementiert wird.

3. Beispielklassendiagramm

AbstractFactory.PNG

4. Beispielprogramm

Ein Programm, das eine Liste von Favoriten im HTML-Format ausgibt.

4-1. Fabrikklasse

Eine Klasse, die eine abstrakte Fabrik darstellt. Link, Fach, Seite erstellen.

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("Klasse" + classname + "Kann nicht gefunden werden.");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return factory;
	}
}

4-2. Gegenstandsklasse

Diese Klasse behandelt Link und Tray auf einheitliche Weise.

Item.java


package factory;

public abstract class Item {
	protected String caption;

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

	public abstract String makeHTML();
}

4-3. Verbindungsklasse

Abstrakter Teil: Eine Klasse, die einen HTML-Link darstellt.

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. Fachklasse

Abstrakte Teile: Eine Klasse von Links und Tray.

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. Seitenklasse

Abstrakter Teil: Eine Klasse, die eine HTML-Seite darstellt.

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 + "geschaffen.");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public abstract String makeHTML();
}

4-6. ListFactory-Klasse

Diese Klasse repräsentiert eine bestimmte Fabrik. Erstellen Sie 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. ListLink-Klasse

Spezifischer Teil: Eine Klasse, die einen HTML-Link darstellt.

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 ListTray-Klasse

Bestimmte Teile: Eine Klasse, die Links und Tray sammelt.

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. ListPage-Klasse

Spezifischer Teil: Eine Klasse, die eine HTML-Seite darstellt.

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 Hauptklasse

Diese Klasse führt die Hauptverarbeitung durch.

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("Punkt installieren", "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("Programmierung");
		pgTray.add(qiita);
		pgTray.add(dot);

		Tray searchTray = factory.createTray("Suchseite");
		searchTray.add(yahoo);
		searchTray.add(excite);
		searchTray.add(google);

		Page page = factory.createPage("Favorit");
		page.add(pgTray);
		page.add(searchTray);
		page.output();
	}
}

4-11 Ausführungsergebnis

キャプチャ.PNG

5. Vorteile

Wenn Sie beispielsweise dem Beispielprogramm eine neue konkrete Factory hinzufügen möchten, erstellen Sie Unterklassen von Factory, Link, Tray und Page und implementieren die abstrakten Methoden für jede. Mit anderen Worten, es verkörpert nur den abstrakten Teil der Factory-Paketklasse. Unabhängig davon, wie viele konkrete Fabriken hinzugefügt werden, muss die abstrakte Fabrik derzeit nicht geändert werden.

  1. GitHub

7. Liste der Entwurfsmuster

8. Referenz

Dieser Artikel und das Beispielprogramm wurden basierend auf den folgenden Büchern erstellt.

Es war sehr leicht zu verstehen und ich habe viel gelernt. Vielen Dank. Die detaillierten Erklärungen zu den Entwurfsmustern und Beispielprogrammen sind geschrieben. Schauen Sie sich also auch die Bücher an.

Recommended Posts

Entwurfsmuster ~ Abstrakte Fabrik ~
abstraktes Fabrikmuster
Abstraktes Fabrikmuster
Entwurfsmuster ~ Fabrikmethode ~
Einführung in Design Patterns (Abstract Factory)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Factory Method Pattern
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Factory Method Muster
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
Vorteile der Erzeugung von AbstractFactory-Mustern mit Enum
Entwurfsmuster ~ Verantwortungskette ~
[Entwurfsmuster] Java-Kernbibliothek
Entwurfsmuster nach Ruby Template-Methode Musternotiz
Einführung in Entwurfsmuster (Factory-Methode)
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fabrikmuster
C # gekautes Designmuster: TemplateMethod
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Was für eine Strategiemusterfabrik, kein Staat
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode