デザインパターン-Builder

builderパターンとは

Builderデザインパターンとは、同じ作成過程で異なる表現形式の結果を得るためのパターンです。
オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にします。

インスタンスの生成は「Director」オブジェクトで定められている生成手順で行い、具体的な生成は「Builder」及びその派生クラスに委ねます。
一覧の流れを行うBuilderをDirectorから呼び出すことで、一定の手順を必要とするオブジェクトの生成を柔軟に実装することが出来ます。
組み合わせるクラスと処理動作が実装されているクラスが別々なので拡張しやすくなります。


現実世界におけるbuilderパターンの例

建築物を建てる場合、以下の手順となります。

  1. 依頼人(Client)は建築物を建てたい場合、建築会社(Director)に指示を出します。
  2. 建築会社(Director)は建築士(Builder)を招致して「どのように建てるか」という手順を作ります。
  3. 具体的な「建築」は建築者(ConcreteBuilder)に作ってもらいます。
  4. 建築者(ConcreteBuilder)は「建築物」を作り上げることで完成させます。

構成要素

  • Client(依頼者)
    • Directorに建築指示を出します。
  • Director(現場監督)
    • 「ConcreteBuilder」の実態に関係なく、「Builder」に提供されているインタフェースのみを使用して建築します。
    • 構築過程は「Client」から隠蔽します。
  • Builder(建築者)
    • 建築過程の各メソッドのインタフェースを定めます。
  • ConcreteBuilder(具体的な建築者)
    • 「Builder」が定めたインタフェースを実装します。

rubyによるbuilderパターンの実装


#!/usr/bin/env ruby

# インターフェイスを定める
class Builder
  def build_part()
  end
end

# Builderのインターフェイスを使ってインスタンスを生成する
class Director
  def initialize(builder)
    @builder = builder
  end
  def construct
    @builder.build_part
  end
end

# 具体的な実装
class ConcreteBuilder < Builder
  def initialize
    @buffer = ""
  end
  def build_part
    @buffer = "建築物"
  end
  def get_result
    return(@buffer)
  end
end

# 建築過程を決定
cbuilder = ConcreteBuilder.new
# 監督者に建築物の様式を指定
director = Director.new(cbuilder)
# 監督者が指示を出して建築物を完成させる
director.construct
# 生成物を受け取る
result = cbuilder.get_result
puts result


関連ページ