Rubyにおけるシングルトンパターンの実装方法についてまとめる。
シングルトンパターンは、インスタンスが1つしか存在しないことを保証するデザインパターンである。
RubyにはSingletonモジュールが用意されており、これを使うことでシングルトンパターンを実装することができる。
require 'singleton'
class Config
include Singleton
attr_accessor :setting
def initialize
@setting = "default"
end
end
config1 = Config.instance
config2 = Config.instance
puts config1 == config2 # true 同じインスタンス
config1.setting = "new"
puts config2.setting # new
new
メソッドをprivateになるため、Config.new
でインスタンスを生成することができない。そのため、Config.instance
で唯一のインスタンスを取得することができる。
new
をprivateにして、クラスメソッドでインスタンスを管理する方法もある。
class Config
@instance = nil
private_class_method :new
def self.instance
@instance ||= new # 自己代入演算子はnilまたはfalseの場合のみに代入を行う
end
end
config1 = Config.instance
config2 = Config.instance
puts config1 == config2 # true
new
がprivateであるため、Config.new
でインスタンスを生成することができない。そのため、Config.instance
で唯一のインスタンスを取得することができる。
クラス変数を使わず、定数を使ってシングルトンパターンを実装する方法もある。
class Config
INSTANCE = new.freeze # 定数自体の変更を禁止
private_class_method :new
end
config1 = Config::INSTANCE
config2 = Config::INSTANCE
puts config1 == config2 # => true
定数にnewしたインスタンスを代入し、newメソッドをprivateにすることで、唯一のインスタンスを取得することができる。
Rubyにはシングルトンパターンを実装するための方法がいくつかある。
その中でも、Singletonモジュール
を使う方法が標準的であり、スレッドセーフな安全な実装であるため推奨される。(たぶん)
関連書籍