prototypeパターン

30分プログラム、その377。Rubyでprototypeパターンをやってみる。
そもそもprototypeパターンは、インスタンスをクラス的に扱うテクニックでしかない。でも、Rubyではクラスを値として扱えるから、prototypeパターンなぞ不要だ、ということが言いたかった。
でも、増補改訂版Java言語で学ぶデザインパターン入門からとってきたサンプルだとそれがうまく言えなかった。また今度チャレンジしよう。

ソースコード

# 文字列を枠で囲むクラス
class MessageBox
  def initialize(decochar)
    @decochar = decochar
  end
  def use(s)
    size = s.size + 4
    puts @decochar * size
    puts "#{@decochar} #{s} #{@decochar}"
    puts @decochar * size
  end
end

# 文字列に下線を引くクラス
class UnderlinePen
  def initialize(ulchar)
    @ulchar = ulchar
  end

  def use(s)
    puts %("#{s}")
    puts " #{@ulchar * s.size} "
  end
end

# 準備
manager = {}
manager[:strong_message] = UnderlinePen.new '~'
manager[:warning_box]    = MessageBox.new '*'
manager[:slash_box]      = MessageBox.new '/'

# 生成
p1 = manager[:strong_message].dup
p1.use 'Hello, world.'

p2 = manager[:warning_box].dup
p2.use 'Hello, world.'

p2 = manager[:slash_box].dup
p2.use 'Hello, world.'

実行結果

"Hello, world."
 ~~~~~~~~~~~~~
*****************
* Hello, world. *
*****************
/////////////////
/ Hello, world. /
/////////////////