Rubyの特異クラスによるシングルトンの実装
タグ: ruby / 初版公開: 2013-12-01

インスタンスの生成を制限したシングルトンを、Rubyの特異クラスを使って実装してみよう。 SingletonClassをシングルトンクラスとする。このクラスの生成SingletonClass.newを不可能にして、インスタンスの取得はSingletonClass.get_instanceでのみ可能とする。

# シングルトン保持用の定数
SINGLETON_OBJECT = Object.new

# 特異クラス定義式による特異クラスの定義
class << SINGLETON_OBJECT
	def only_method
		:only_method
	end
end

=begin
# 注) 上記はSINGLETON_OBJECTに
#     特異メソッドを定義する以下と同様
def SINGLETON_OBJECT.only_method
	:only_method
end
=end

# シングルトンを得るための特異クラスの作成
SingletonClass = SINGLETON_OBJECT.singleton_class

# 特異クラスのクラスメソッド(クラスの特異メソッド)の定義
def SingletonClass.get_instance
	SINGLETON_OBJECT
end

# シングルトンの確認
p SINGLETON_OBJECT # => #<Object:0x000000026504f8> 
p SingletonClass # => #<Class:#<Object:0x000000026504f8>>
p SingletonClass.get_instance # => 
#<Object:0x000000026504f8>

サンプルコードの出典は、パーフェクトRubyの6-3-8から。(一部改変)

パーフェクトRuby (PERFECT SERIES 6)
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 10,788