This is an old revision of the document!
관련 부품을 조합해서 인스턴스 생성
package factory;
public abstract class Factory {
public static Factory getFactory(String className) {
Factory factory = null;
try {
factory = (Factory) Class.forName(className).newInstance();
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
e.printStackTrace();
}
return factory;
}
public abstract LinkItem createLink(String caption, String url);
public abstract TrayItem createTray(String caption);
public abstract Page createPage(String caption, String author);
}
public abstract class Item {
protected String caption;
public Item(String caption) {
super();
this.caption = caption;
}
public abstract String makeHTML();
}
package factory;
public abstract class LinkItem extends Item {
protected String url;
public LinkItem(String caption, String url) {
super(caption);
this.url = url;
}
}
package factory;
import java.util.ArrayList;
public abstract class TrayItem extends Item {
protected final ArrayList<Item> tray = new ArrayList<>();
public TrayItem(String caption) {
super(caption);
}
public void add(Item item) {
tray.add(item);
}
}
package factory;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
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() {
System.out.println(this.makeHTML());
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(title + ".html"), StandardCharsets.UTF_8))) {
bw.write(this.makeHTML());
} catch (Exception e) {
e.printStackTrace();
}
}
public abstract String makeHTML();
}
package listfactory;
import factory.Factory;
import factory.LinkItem;
import factory.Page;
import factory.TrayItem;
public class ListFactory extends Factory {
@Override
public LinkItem createLink(String caption, String url) {
return new ListLink(caption, url);
}
@Override
public TrayItem createTray(String caption) {
return new ListTray(caption);
}
@Override
public Page createPage(String caption, String author) {
return new ListPage(caption, author);
}
}
package listfactory;
import factory.LinkItem;
public class ListLink extends LinkItem {
public ListLink(String caption, String url) {
super(caption, url);
}
@Override
public String makeHTML() {
StringBuilder sb = new StringBuilder();
sb.append("<li>");
sb.append("<a href=\"");
sb.append(url);
sb.append("\">");
sb.append(caption);
sb.append("</a>");
sb.append("</li>\n");
return sb.toString();
}
}
package listfactory;
import factory.TrayItem;
public class ListTray extends TrayItem {
public ListTray(String caption) {
super(caption);
}
@Override
public String makeHTML() {
StringBuilder sb = new StringBuilder();
sb.append("<li>\n");
sb.append(caption);
sb.append("\n<ul>\n");
tray.forEach(item -> sb.append(item.makeHTML()));
sb.append("</ul>\n");
sb.append("</li>");
return sb.toString();
}
}
package listfactory;
import factory.Page;
public class ListPage extends Page {
public ListPage(String title, String author) {
super(title, author);
}
@Override
public String makeHTML() {
StringBuilder sb = new StringBuilder();
sb.append("<html>\n");
sb.append("<head><title>");
sb.append(title);
sb.append("</title></head>\n");
sb.append("<body>\n");
sb.append("<h1>");
sb.append(title);
sb.append("</h1>");
sb.append("<ul>\n");
content.forEach(item -> sb.append(item.makeHTML()));
sb.append("</ul>\n");
sb.append("<hr>");
sb.append("<footer>");
sb.append(author);
sb.append("</footer>");
sb.append("</body>\n</html>");
return sb.toString();
}
}
package divfactory;
import factory.Factory;
import factory.LinkItem;
import factory.Page;
import factory.TrayItem;
public class DivFactory extends Factory {
@Override
public LinkItem createLink(String caption, String url) {
return new DivLink(caption, url);
}
@Override
public TrayItem createTray(String caption) {
return new DivTray(caption);
}
@Override
public Page createPage(String caption, String author) {
return new DivPage(caption, author);
}
}
package divfactory;
import factory.LinkItem;
public class DivLink extends LinkItem {
public DivLink(String caption, String url) {
super(caption, url);
}
@Override
public String makeHTML() {
StringBuilder sb = new StringBuilder();
sb.append("\n<span>");
sb.append("<a href=\"");
sb.append(url);
sb.append("\">");
sb.append(caption);
sb.append("</a>");
sb.append("</span>\n");
return sb.toString();
}
}
package divfactory;
import factory.TrayItem;
public class DivTray extends TrayItem {
public DivTray(String caption) {
super(caption);
}
@Override
public String makeHTML() {
StringBuilder sb = new StringBuilder();
sb.append("\n<div style=\"border: 1px solid black; ; margin: 5px; padding: 5px\">");
sb.append("\n<div>");
sb.append(caption);
sb.append("</div>\n");
sb.append("\n<div>");
tray.forEach(item -> sb.append(item.makeHTML()));
sb.append("</div>\n");
sb.append("</div>\n");
sb.append("<br>\n");
return sb.toString();
}
}
package divfactory;
import factory.Page;
public class DivPage extends Page {
public DivPage(String title, String author) {
super(title, author);
}
@Override
public String makeHTML() {
StringBuilder sb = new StringBuilder();
sb.append("<html>\n");
sb.append("<head><title>");
sb.append(title);
sb.append("</title></head>\n");
sb.append("<body>\n");
sb.append("<h1>");
sb.append(title);
sb.append("</h1>");
sb.append("\n<div>");
content.forEach(item -> sb.append(item.makeHTML()));
sb.append("</div>\n");
sb.append("<hr>");
sb.append("<footer>");
sb.append(author);
sb.append("</footer>");
sb.append("</body>\n</html>");
return sb.toString();
}
}
import factory.Factory;
import factory.LinkItem;
import factory.Page;
import factory.TrayItem;
public class Main {
public static void main(String[] args) {
operateFactory("listfactory.ListFactory");
operateFactory("divfactory.DivFactory");
}
private static void operateFactory(String className) {
Factory factory = Factory.getFactory(className);
LinkItem link_todayHumor = factory.createLink("오늘의 유머", "http://www.todayhumor.co.kr");
LinkItem link_ruliweb = factory.createLink("루리웹", "http://ruliweb.com/");
TrayItem trary_community = factory.createTray("커뮤니티");
trary_community.add(link_todayHumor);
trary_community.add(link_ruliweb);
LinkItem link_google = factory.createLink("Google", "http://www.google.com");
LinkItem link_daum = factory.createLink("Daum", "http://www.daum.net");
LinkItem link_naver = factory.createLink("Naver", "http://www.naver.com");
LinkItem link_naver_m = factory.createLink("Naver Mobile", "http://m.naver.com");
TrayItem tray_naver = factory.createTray("Naver");
tray_naver.add(link_naver);
tray_naver.add(link_naver_m);
TrayItem tray_searchEngine = factory.createTray("검색 엔진");
tray_searchEngine.add(link_google);
tray_searchEngine.add(link_daum);
tray_searchEngine.add(tray_naver);
Page page = factory.createPage(className, "By ledyx");
page.add(trary_community);
page.add(tray_searchEngine);
page.output();
}
}
<html> <head><title>listfactory.ListFactory</title></head> <body> <h1>listfactory.ListFactory</h1><ul> <li> 커뮤니티 <ul> <li><a href="http://www.todayhumor.co.kr">오늘의 유머</a></li> <li><a href="http://ruliweb.com/">루리웹</a></li> </ul> </li><li> 검색 엔진 <ul> <li><a href="http://www.google.com">Google</a></li> <li><a href="http://www.daum.net">Daum</a></li> <li> Naver <ul> <li><a href="http://www.naver.com">Naver</a></li> <li><a href="http://m.naver.com">Naver Mobile</a></li> </ul> </li></ul> </li></ul> <hr><footer>By ledyx</footer></body> </html>
<html> <head><title>divfactory.DivFactory</title></head> <body> <h1>divfactory.DivFactory</h1> <div> <div style="border: 1px solid black; ; margin: 5px; padding: 5px"> <div>커뮤니티</div> <div> <span><a href="http://www.todayhumor.co.kr">오늘의 유머</a></span> <span><a href="http://ruliweb.com/">루리웹</a></span> </div> </div> <br> <div style="border: 1px solid black; ; margin: 5px; padding: 5px"> <div>검색 엔진</div> <div> <span><a href="http://www.google.com">Google</a></span> <span><a href="http://www.daum.net">Daum</a></span> <div style="border: 1px solid black; ; margin: 5px; padding: 5px"> <div>Naver</div> <div> <span><a href="http://www.naver.com">Naver</a></span> <span><a href="http://m.naver.com">Naver Mobile</a></span> </div> </div> <br> </div> </div> <br> </div> <hr><footer>By ledyx</footer></body> </html>