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
関連
-
redisクラスタ構築のチュートリアルと発生した問題
-
Rubyのシングルトンメソッドとシングルトンクラス
-
Ruby on RailsのWebプロジェクト構築のためのシンプルガイド
-
Jekyll静的ウェブサイトのバックエンドエンジンのチュートリアル
-
RubyおよびRuby on RailsでJSON形式のデータをパースするためのチュートリアルの例
-
Rubyのデザインパターン開発におけるProxyパターンの利用について
-
Rubyのデザインパターン開発におけるobserverパターンの一例
-
Rubyの4つの比較関数(equal?, eql?, ==, ===)について解説します。
-
Ruby on Railsのjquery_ujsコンポーネントが遅くなる問題が解決された
-
Ruby WebDriverガイド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
RVMを使ってRuby/Railsのバージョン切り替えを制御する
-
Luhnアルゴリズムの学習とそのRuby実装コード例
-
win10でvirtualbox+vagrantでrubyの開発マシン環境を構築する
-
UbuntuでRuby on RailsフレームワークとRubyMine IDEを設定する
-
RubyのProcクラスとProc.newメソッドの使用法
-
RubyとRuby on Railsフレームワーク環境構築の簡潔なチュートリアル
-
rubyのダブルイコール==問題
-
Ruby on RailsにおけるCucumberの活用を解説します。
-
Rubyでパーセント記号とリテラル値を使用する例
-
ブログのスパムメッセージを簡単にブロックする方法