Voici un résumé du ** modèle Abstract Factory ** dans le modèle de conception GoF.
--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.
Un programme qui génère une liste de favoris au format HTML.
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;
}
}
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();
}
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;
}
}
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);
}
}
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();
}
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);
}
}
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";
}
}
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();
}
}
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();
}
}
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();
}
}
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.
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