【デザインパターン】【GoF】【Java】Builder パターン ~構築者~

Builder パターン

 * 多くの構成要素からなるオブジェクトを組み立てるための部品を返す

登場人物

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%B3
http://kawara-tan.blogspot.jp/2010/05/builder.html

Strategy パターン

 * Builder を Strategy パターンにおける Context として設計することにより、
   インスタンスの生成過程をより柔軟にすることができる。

Composite パターン

 * Composite のような複雑な構造を持つインスタンスは、
   Builder パターンを応用することによって効率的に生成することができる。