登場人物
Builder(建築者)
* 建築過程の各メソッドのインタフェース
ConcreteBuilder(具体的な建築者)
* Builderクラスの実装と、Productオブジェクトを取り出すメソッドを持つ
Director(監督者)
* 「Builder」に提供されているインタフェースのみを使用し、建築
Client(利用者)
* 利用者
サンプル
IDocumentBuilder.java
* Builder(建築者)public interface IDocumentBuilder { public abstract void setTitle(String value); public abstract void addContent(String value); public abstract String getResult(); }
HtmlBuilder.java
* ConcreteBuilder(具体的な建築者1)public class HtmlBuilder implements IDocumentBuilder { String title; private StringBuffer content; public HtmlBuilder() { this.content = new StringBuffer(); } public void setTitle(String value) { this.title = value; } public void addContent(String value) { this.content.append(value); } public String getResult() { String format = "<html><head><title>%s</title></head><body>%s</body></html>"; return String.format(format, this.title, this.content.toString()); } }
XmlBuilder.java
* ConcreteBuilder(具体的な建築者2)public class XmlBuilder implements IDocumentBuilder { String title; private StringBuffer content; public XmlBuilder() { this.content = new StringBuffer(); } public void setTitle(String value) { this.title = value; } public void addContent(String value) { this.content.append(value); } public String getResult() { String format = "<?xml version='1.0' ?><document><title>%s</title><result>%s</result></document>"; return String.format(format, this.title, this.content.toString()); } }
DocumentDirector.java
* Director(監督者)public class DocumentDirector{ private IDocumentBuilder builder; public DocumentDirector(IDocumentBuilder builder) { this.builder = builder; } public String construct() { builder.setTitle("Sample Title"); builder.addContent("No pain No gain<br>"); builder.addContent("That's fine as long as you can done.<br>"); return builder.getResult(); } }
Main.java
* Client(利用者)public class Main { public static void main(String[] args) { String result = ""; DocumentDirector director1 = new DocumentDirector(new HtmlBuilder()); result = (String)director1.construct(); System.out.println(result); System.out.println(); DocumentDirector director2 = new DocumentDirector(new XmlBuilder()); result = (String)director2.construct(); System.out.println(result); } }
出力結果
<html><head><title>Sample Title</title></head><body>No pain No gain<br>That's fine as long as you can done.<br></body></html> <?xml version='1.0' ?><document><title>Sample Title</title><result>No pain No gain<br>That's fine as long as you can done.<br></result></document>
関連するデザインパターン
http://ja.wikipedia.org/wiki/Builder_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3http://kawara-tan.blogspot.jp/2010/05/builder.html
Strategy パターン
* Builder を Strategy パターンにおける Context として設計することにより、 インスタンスの生成過程をより柔軟にすることができる。
Composite パターン
* Composite のような複雑な構造を持つインスタンスは、 Builder パターンを応用することによって効率的に生成することができる。
参考文献
http://kurohuku.blogspot.jp/2013/09/dbuilder.htmlhttp://sizuki0514.blogspot.jp/2012/12/builder.html