登場人物
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