[JAVA] Abstraktes Fabrikmuster

Was ist das Abstract Factory-Muster?

Erstellen Sie ein abstraktes Produkt, indem Sie abstrakte Teile kombinieren. Konzentrieren Sie sich auf die Schnittstelle (API) und nicht auf die spezifische Implementierung der Komponente. Anschließend werden die Teile zusammengesetzt und die Produkte nur über die Schnittstelle (API) zusammengesetzt.

Die Rolle des abstrakten Produkts

Die Rolle "Abstraktes Produkt" definiert die Schnittstelle von abstrakten Teilen und Produkten, die von der Rolle "Abstrakte Fabrik" erstellt wurden.

package factory;

/**
 *Eine Klasse, die HTML-Hyperlinks abstrakt ausdrückt
 *
 */
public abstract class Link extends Item{
	//Zum Speichern der URL des Linkziels
	protected String url;

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

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

/**
 *Eine Klasse, die abstrakt die gesamte HTML-Seite darstellt
 *
 */
public abstract class Page {
	protected String title;
	protected String author;
	protected ArrayList<Item> content = new ArrayList<>();

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

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

import java.util.ArrayList;
/**
 *Eine Klasse, die eine Sammlung mehrerer Links und Trays darstellt
 *
 */
public abstract class Tray extends Item{
	protected ArrayList<Item> tray = new ArrayList<>();

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

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

Die Rolle der abstrakten Fabrik

Die AbstractFactory-Rolle definiert die Schnittstelle zum Erstellen einer Instanz der AbstractProduct-Rolle.

package factory;

/**
 *Eine Klasse, die durch Angabe eines Klassennamens einen bestimmten Factory-Moment erstellt
 *
 */
public abstract class Factory {
	public static Factory getFactory(String className) {
		Factory factory = null;
		try {
			factory = (Factory)Class.forName(className).newInstance();
		} catch (ClassCastException e) {
			System.out.println("Klasse" + className + "Kann nicht gefunden werden.");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return factory;
	}

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

}

Die Rolle des Kunden

Die Client-Rolle ist eine Rolle, die nur über die Schnittstelle zwischen der Abstract Factory-Rolle und der Abstract Product-Rolle funktioniert. Die Kundenrolle kennt bestimmte Teile, Produkte oder Fabriken nicht.

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

public class Main {

	public static void main(String[] args) {

		if (args.length != 1) {
			System.out.println("Usage: java Main class.mame.of.ConcreateFactory");
			System.out.println("Example 1: java Main listfactory,ListFactory");
			System.out.println("Example 2: java Main tablefactory,TableFactory");
			System.exit(0);
		}

		Factory factory = Factory.getFactory(args[0]);

		Link asahi = factory.createLink("Asahi Shimbun", "http://www.asahi.com/");
		Link yomiuri = factory.createLink("Yomiuri Shimbun", "http://www.yomiuri.co.jp/");

		Link usYahoo = factory.createLink("Yahoo!", "http://www.yahoo.com/");
		Link jpYahoo = 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 trayNews = factory.createTray("Zeitung");
		trayNews.add(asahi);
		trayNews.add(yomiuri);

		Tray trayYahoo = factory.createTray("Yahoo!");
		trayYahoo.add(usYahoo);
		trayYahoo.add(jpYahoo);

		Tray traySearch = factory.createTray("Suchmaschine");
		traySearch.add(trayYahoo);
		traySearch.add(excite);
		traySearch.add(google);

		Page page = factory.createPage("LinkPage", "Taro Tanaka");
		page.add(trayNews);
		page.add(traySearch);
		page.output();
	}

}

Die Rolle des Betonprodukts

In der Rolle von Conctete Product wird die Schnittstelle (API) der Rolle von Abstract implementiert.

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

}
package listFactory;

import java.util.Iterator;

import factory.Item;
import factory.Page;

public class ListPage extends Page{

	public ListPage(String title, String author) {
		super(title, author);
	}

	@Override
	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<Item> it = content.iterator();
		while (it.hasNext()) {
			Item item = it.next();
			buffer.append(item.makeHtml());
		}
		buffer.append("</ul>\n");
		buffer.append("<hr><address>" + author + "</address>");
		buffer.append("</body></html>\n");
		return buffer.toString();
	}
}
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<Item> it = tray.iterator();
		while (it.hasNext()) {
			Item item = it.next();
			buffer.append(item.makeHtml());
		}
		buffer.append("</ul>\n");
		buffer.append("</li>\n");
		return buffer.toString();
	}
}

Die Rolle der Betonfabrik

Die Rolle Concrete Factory definiert die Schnittstelle (API) für die Rolle Abstract Factory.

package listFactory;

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

public class ListFactory extends Factory {

	@Override
	public Link createLink(String caption, String url) {
		return new ListLink(caption, url);
	}

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

	@Override
	public Page createPage(String title, String author) {
		return new ListPage(title, author);
	}
}

Eine HTML-Datei, die erstellt wird, indem tableFactory.TableFactory als Argument übergeben und ausgeführt wird

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

Fügen Sie eine weitere Betonfabrik hinzu

Es war einfach, eine Fabrik hinzuzufügen. Weil klar ist, welche Art von Klasse erstellt und welche Art von Methode implementiert werden soll.

package tableFactory;

import factory.Link;

public class TableLink extends Link {

	public TableLink(String caption, String url) {
		super(caption, url);
	}

	@Override
	public String makeHtml() {
		return "<td><a href=\"" + url + "\">" + caption + "</a></td>\n";
	}
}
package tableFactory;

import java.util.Iterator;

import factory.Item;
import factory.Page;

public class TablePage extends Page {

	public TablePage(String title, String author) {
		super(title, author);
	}

	@Override
	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("<table width=\"80%\" border=\"3\">\n");
		Iterator<Item> it = content.iterator();
		while (it.hasNext()) {
			Item item = it.next();
			buffer.append("<tr>" + item.makeHtml() + "</tr>");
		}
		buffer.append("</table>\n");
		buffer.append("<hr><address>" + author + "</address>");
		buffer.append("</body></html>\n");
		return buffer.toString();
	}
}
package tableFactory;

import java.util.Iterator;

import factory.Item;
import factory.Tray;

public class TableTray extends Tray {

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

	@Override
	public String makeHtml() {
		StringBuffer buffer = new StringBuffer();
		buffer.append("<td>");
		buffer.append("<table width=\"100%\" border=\"1\"><tr>");
		buffer.append("<td bgcolor=\"#cccccc\" align=\"center\" colspan=\"" + tray.size() + "\"><b>" + caption + "</b></td>");
		buffer.append("</tr>\n");
		buffer.append("<tr>\n");
		Iterator<Item> it = tray.iterator();
		while (it.hasNext()) {
			Item item = it.next();
			buffer.append(item.makeHtml());
		}
		buffer.append("</tr></table>");
		buffer.append("</td>");
		return buffer.toString();
	}
}
package tableFactory;

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

public class TableFactory extends Factory {

	@Override
	public Link createLink(String caption, String url) {
		return new TableLink(caption, url);
	}

	@Override
	public Tray createTray(String caption) {
		return new TableTray(caption);
	}

	@Override
	public Page createPage(String title, String author) {
		return new TablePage(title, author);
	}
}

Die HTML-Datei, die durch Ausführen mit dem Argument zur Laufzeit erstellt wurde und auf tableFactory.TableFactory gesetzt ist, ohne Main zu ändern, was die Rolle des Clients ist.

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

https://github.com/aki0207/abstractFactory

Ich habe dies als Referenz verwendet. Erweiterte überarbeitete Ausgabe Einführung in in Java gelernte Entwurfsmuster

Recommended Posts

abstraktes Fabrikmuster
Abstraktes Fabrikmuster
Entwurfsmuster ~ Abstrakte Fabrik ~
Factory Method Pattern
Factory Method Muster
Entwurfsmuster ~ Fabrikmethode ~
Vorteile der Erzeugung von AbstractFactory-Mustern mit Enum
Einführung in Design Patterns (Abstract Factory)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Prototypmuster
Erinnerungsmuster
Was für eine Strategiemusterfabrik, kein Staat
Vermittlermuster
Iteratormuster
Zusammengesetztes Muster
Beobachtermuster
Builder-Muster
Brückenmuster
Befehlsmuster
Builder-Muster
Strategiemuster
Iteratormuster
Besuchermuster
Adaptermuster
Proxy-Muster
Strategiemuster
Zusammengesetztes Muster
Singleton-Muster
Singleton-Muster
Prototypmuster
Fassadenmuster
Dekorationsmuster
Fliegengewichtsmuster
Dekorateur Muster
Vermittlermuster
Fassadenmuster
Besuchermuster
Brückenmuster