# ビルダーパターン # # Java言語で学ぶデザインパターンと同様の例題をRubyで記述した。 # # coded by Takehiro Kaga # # 本パターンは構造を持ったインスタンスを組み上げていく # Builderのインターフェイスを持ち具体的にインスタンスを組み上げる # ConcreateBuilderがある # DirectorはBuiderのインターフェイスだけを使って指示を出し、ConcreateBuilderに # インスタンスを組み上げさせる # 従って、色々なConcreateBuilderがあってもDirectorは影響を受けず指示できる # 本パターンの特徴はConcreateBuilderの交換可能性を持つことである # 例えばプレインテキスト形式、HTML形式、XML形式を交換可能である class Builder # インターフェイスを定めている def makeTitle(title) end def makeString(str) end def makeItems(items) end def close end end class Director # Builderのインターフェイスを使ってインスタンスを生成する def initialize(builder) @builder = builder end def construct @builder.makeTitle("Greeting") @builder.makeString("朝から昼にかけて") @builder.makeItems( [ "おはようございます。", "こんにちは。" ]) @builder.makeString("夜で") @builder.makeItems( [ "こんばんは。", "おやすみなさい。", "さようなら。" ]) @builder.close end end class TextBuilder < Builder # ConcreateBuilder def initialize @buffer = "" end def makeTitle(title) @buffer += "==============================\n" @buffer += ("『" + title + "』\n" ) @buffer += "\n" end def makeString(str) @buffer += ("■" + str + "\n") @buffer += "\n" end def makeItems(items) items.each {|item| @buffer += (" ・" + item + "\n") } @buffer += "\n" end def close @buffer += "==============================\n" end def getResult @buffer end end class HTMLBuilder < Builder # ConcreateBuilder def initialize @filename = "" end def makeTitle(title) @filename = title + ".HTML" @file = File.open(@filename, "w") @file.puts "" + title + "" @file.puts "

" + title + "

" end def makeString(str) @file.puts "

" + str + "

" end def makeItems(items) @file.puts "" end def close @file.puts "" @file.close end def getResult @filename end end textbuilder = TextBuilder.new # ConcreateBuilderを生成 建築物の様式を決定 director = Director.new(textbuilder) # 監督者に建築物の様式を指定 director.construct # 監督者が指示を出す 建築物が出来上がる result = textbuilder.getResult puts result htmlbuilder = HTMLBuilder.new director = Director.new(htmlbuilder) director.construct filename = htmlbuilder.getResult puts filename + "が作成されました"