デザインパターン。

何となくデザインパターンを復習。すっかり忘れてしまっていて悲しい。
とりあえず、こちらで公開されているAdapterパターン、Singletonパターンを自分なりに書き直してみた。

Adapterパターン

継承を使った場合
class Banner
  def initialize(str)
    @str = str
  end
  def show_with_paren
    puts("(#{@str})")
  end
  def show_with_aster
    puts("*#{@str}*")
  end
end

class PrintBanner < Banner
  alias print1 show_with_paren
  alias print2 show_with_aster
end

pb = PrintBanner.new('Hello!')
pb.print1
pb.print2
委譲を使った場合
require 'forwardable'

class Banner
  def initialize(str)
    @str = str
  end
  def show_with_paren
    puts("(#{@str})")
  end
  def show_with_aster
    puts("*#{@str}*")
  end
end

class PrintBanner
  extend Forwardable
  def initialize(str)
    @banner = Banner.new(str)
  end
  def_delegator :@banner, :show_with_paren, :print1
  def_delegator :@banner, :show_with_aster, :print2
end

pb = PrintBanner.new('Hello!')
pb.print1
pb.print2

結果。

(Hello!)
 *Hello!*

Singletonパターン

require 'singleton'

class SingletonSample
  include Singleton
end

# コンストラクタはprivateなのでインスタンスを
# 取得するにはinstanceメソッドを使用する
sin1 = SingletonSample.instance
sin2 = SingletonSample.instance

p sin1 == sin2
p sin1.object_id
p sin2.object_id

begin
  sin3 = SingletonSample.new
rescue => err
  puts(err)
end

結果。

true
21612680
21612680
private method `new' called for SingletonSample:Class