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 "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 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 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();
}
}
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 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);
}
}
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.
https://github.com/aki0207/abstractFactory
Ich habe dies als Referenz verwendet. Erweiterte überarbeitete Ausgabe Einführung in in Java gelernte Entwurfsmuster
Recommended Posts