Hier ist eine Zusammenfassung des ** Abstract Factory-Musters ** im GoF-Entwurfsmuster.
--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.
Ein Programm, das eine Liste von Favoriten im HTML-Format ausgibt.
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;
}
}
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();
}
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;
}
}
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);
}
}
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();
}
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);
}
}
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";
}
}
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();
}
}
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();
}
}
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();
}
}
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.
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