Singleton パターン

Singleton パターンを実装してみました。

#!/usr/local/bin/ruby

class Singleton
  private_class_method :new
  @@instance = nil
  def Singleton.instance
    @@instance = new unless @@instance
    @@instance
  end
end

object1 = Singleton.instance
object2 = Singleton.instance

p object1
p object2
  • private_class_method で Singleton#new を実行禁止にする
  • クラスメソッドの定義の仕方 = def Singleton.method ... end

の二点がポイントです。実行結果は

$ ruby singleton.rb
#<Singleton:0x357d00>
#<Singleton:0x357d00>

となりました。確かに object1 と object2 は同じインスタンスです。

ところで、Ruby には Singleton パターン用のモジュールがあります。モジュールを include するだけでそのクラスが Singleton になります。

#!/usr/local/bin/ruby

require 'singleton'

class World
  include Singleton
end

world1 = World.instance
world2 = World.instance

p world1
p world2

Singleton パターン以外のデザインパターン用ライブラリとしては

  • Delegate パターン
  • Observer パターン

用のモジュールが標準サポートされているようです。手元にある Ruby デスクトップリファレンスに掲載されていたのはこの三つです。Ruby デスクトップリファレンスは 1.6 向けなので、1.8 には他にも追加されているのかもしれません。

Rubyデスクトップリファレンス

Rubyデスクトップリファレンス