Skip to content

Instantly share code, notes, and snippets.

@yamano
Created January 26, 2012 02:23
Show Gist options
  • Save yamano/1680549 to your computer and use it in GitHub Desktop.
Save yamano/1680549 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
# 本パターンは構造を持ったインスタンスを組み上げていく
# Builderのインターフェイスを持ち具体的にインスタンスを組み上げる
# ConcreateBuilderがある
# DirectorはBuiderのインターフェイスだけを使って指示を出し、ConcreateBuilderにインスタンスを組み上げさせる
# 従って、色々なConcreateBuilderがあってもDirectorは影響を受けず指示できる
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 "<html><head><title>" + title + "</title></head><body>"
@file.puts "<h1>" + title + "</h1>"
end
def makeString(str)
@file.puts "<p>" + str + "</p>"
end
def makeItems(items)
@file.puts "<ul>"
items.each {|item| @file.puts "<li>" + item + "</li>" }
@file.puts "</ul>"
end
def close
@file.puts "</body></html>"
@file.close
end
def getResult
@filename
end
end
class StringBuilder < Builder
def initialize @string = "" end
def makeTitle(title) @string += title + "\n" end
def makeString(str) @string += str + "\n" end
def makeItems(items) @string += items.join(',') + "\n" end
def close @string += "\n" end
def getResult @string 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 + "が作成されました"
stringbuilder = StringBuilder.new
director = Director.new(stringbuilder)
director.construct
result = stringbuilder.getResult
puts result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment