1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Builderビルダーパターンを用いたRubyデザインパターンプログラミング例

2022-01-31 03:37:20

まずは、デザインパターンの基本的な考え方からおさらいしてみましょう。
定義
複雑なオブジェクトの構築とその表現を分離し、同じ構築プロセスで異なる表現を作成することを可能にします。
ビルダーはその製品がどのように組み立てられるかを隠しているので、製品の内部表現を変える必要がある場合は、ビルダーを並べ替えればよい。
ユーティリティの範囲
1. 複雑なオブジェクトを作成するためのアルゴリズムが、そのオブジェクトの構成要素やその組み立て方に依存しない場合。
2. 構築プロセスにおいて、構築されるオブジェクトの異なる表現を許容する必要がある場合。
役割
このようなデザインパターンでは、次のようないくつかの役割があります。
1. ビルダー:製品オブジェクトの様々な部分を作成するための抽象的なインターフェースを指定する。
2.ConcreteBuilder: Builderのインタフェースを実装し、本製品の部品を構成・組立、作成する表現を定義・指定し、本製品を取得するためのインタフェースを提供する。
3.ディレクター Builder インターフェースを使用したオブジェクトを構築します。
4.製品。コンクリートビルダーは、この製品の内部表現を作成し、その組み立てプロセスを定義する。このクラスには、構成部品を定義するクラスと、それらの部品を最終製品に組み立てるインターフェイスが含まれる。
ここでは、その例を見てみましょう。
要件です。

頭、胴体、両手、両足のある小さな人物を描くだけです。

初期コードです。

# -*- encoding: utf-8 -*-

# villain one
puts 'This is the first villain'
puts 'villain one: head'
puts 'villain one: thin body'
puts 'villain one: hands'
puts 'Villain one: feet'

#villain two
puts 'This is the second villain'
puts 'Villain two: head'
puts 'Villain two: fat body'
puts 'Villain two: hands'
puts 'Villain two: feet'



問題点:コードが重複し、エラーが発生しやすい、手足がない、など。

改善されたコード

# -*- encoding: utf-8 -*-

#
class PersionBuilder
  def head
    puts ''
  end
  def body
    puts ''
  end
  def arm
    puts ''
  end
  def leg
    puts ''
  end
end

#Villain I
class PersionThinBuilder < PersionBuilder
  def head
    puts 'head'
  end
  def body
    puts 'thin body'
  end
  def arm
    puts 'hands'
  end
  def leg
    puts 'feet'
  end
end
#Villain II
class PersionFatBuilder < PersionBuilder
  def head
    puts 'head'
  end
  def body
    puts 'fat body'
  end
  def arm
    puts 'hands'
  end
  def leg
    puts 'feet'
  end
end

#Conductor class
class PersionDirect
  def initialize(persion)
    @persion = persion
  end
  
  def create_persion
    @persion.head
    @persion.body
    @persion.arm
    @persion.leg
  end

end
puts 'This is the first villain'
p1 = PersionThinBuilder.new
pd1 = PersionDirect.new(p1)
pd1.create_persion

puts 'This is the second villain'
p2 = PersionThinBuilder.new
pd2 = PersionDirect.new(p2)
pd2.create_persion