Table of Contents

Abstract Factory Pattern

관련 부품을 조합해서 인스턴스 생성

Factory

Abstract Factory

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);
}

Abstract Products

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();
}

Concrete Factories

Concrete Factory1 - ListFactory

Concrete Factory

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);
	}

}

Concrete Products

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();
	}

}

Concrete Factory2 - DivFactory

Concrete Factory

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);
	}

}

Concrete Products

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();
	}

}

Client

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();
	}
}

실행 결과

Concrete Factory1 - ListFactory

<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>

Concrete Factory2 - DivFactory

<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>