AbstractFactoryパターン
ややこしい。確かに理解しずらいねぇ。Java楽しくなってきた!
% find . -name "*.java" -print0 |xargs -0 cat [] package factory; public abstract class Factory { public static Factory getFactory(String className) { Factory factory = null; try { factory = (Factory) Class.forName(className).newInstance(); } 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); } package factory; public abstract class Item implements MakeHtml { protected String caption; public Item(String caption) { this.caption = caption; } } package factory; public abstract class Link extends Item implements MakeHtml { protected String url; public Link(String caption, String url) { super(caption); this.url = url; } } package factory; public interface MakeHtml { public String makeHTML(); } package factory; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.List; public abstract class Page implements MakeHtml { protected String title; protected String author; protected List<Item> content = new ArrayList<Item>(); public Page(String title, String author) { this.title = title; this.author = author; } public void add(Item item) { content.add(item); } public void output() { String fileName = title + ".html"; try { Writer writer = new FileWriter(fileName); writer.write(makeHTML()); writer.close(); System.out.println(fileName + "を作成しました。"); } catch (IOException e) { e.printStackTrace(); } } } package factory; import java.util.ArrayList; import java.util.List; public abstract class Tray extends Item implements MakeHtml { protected List<Item> tray = new ArrayList<Item>(); public Tray(String caption) { super(caption); } public void add(Item item) { tray.add(item); } } 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); } } package listfactory; import factory.Link; public class ListLink extends Link { public ListLink(String caption, String url) { super(caption, url); } @Override public String makeHTML() { return " <li><a href'" + url + "'>" + caption + "</a></li>\n"; } } package listfactory; 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 sb = new StringBuffer(); sb.append("<html><head><title>" + title + "</title></head>\n"); sb.append("<body>\n"); sb.append("<h1>" + title + "</h1>"); sb.append("<ul>"); for (Item item : content) { sb.append(item.makeHTML()); } sb.append("</ul>\n"); sb.append("<hr><address>" + author + "</address>"); sb.append("</body></html>\n"); return sb.toString(); } } package listfactory; import factory.Item; import factory.Tray; public class ListTray extends Tray { public ListTray(String caption) { super(caption); } @Override public String makeHTML() { StringBuffer sb = new StringBuffer(); sb.append("<li>\n"); sb.append(caption + "\n"); sb.append("<ul>\n"); for (Item item : tray) { sb.append(item.makeHTML()); } sb.append("</ul>\n"); sb.append("</li>\n"); return sb.toString(); } } 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 asahi = factory.createLink("asahi", "http://hoge.com"); Link yomiuri = factory.createLink("yomiuri", "http://hoge.com"); Link yahoo = factory.createLink("yahoo", "http://hoge.com"); Link google = factory.createLink("google", "http://hoge.com"); Tray trayNews = factory.createTray("News"); trayNews.add(asahi); trayNews.add(yomiuri); Tray traySearch = factory.createTray("Search"); traySearch.add(yahoo); traySearch.add(google); traySearch.add(trayNews); Page page = factory.createPage("Links", "author"); page.add(trayNews); page.add(traySearch); page.output(); } }
% find . -name "*.html" -print0 |xargs -0 cat [] <html><head><title>Links</title></head> <body> <h1>Links</h1><ul><li> News <ul> <li><a href'http://hoge.com'>asahi</a></li> <li><a href'http://hoge.com'>yomiuri</a></li> </ul> </li> <li> Search <ul> <li><a href'http://hoge.com'>yahoo</a></li> <li><a href'http://hoge.com'>google</a></li> <li> News <ul> <li><a href'http://hoge.com'>asahi</a></li> <li><a href'http://hoge.com'>yomiuri</a></li> </ul> </li> </ul> </li> </ul> <hr><address>author</address></body></html>