特異メソッドとその用途Singletonパターン
特異メソッドはこんな感じ
message = “Hello” def message.build_greeting(target) “#{self} , #{target}” end message.build_greeting(“world”) #=> Hello,world
たとえばmessage2 = “Hello"なんかにしても、 message2.build_greeting(“world”)は呼び出せません。
定義の際、messageの文字列オブジェクトだけにbuild_greetingは属します。たとえ同じ値とオブジェクトの”Hello"だとしても、build_greetingを呼び出すことはできません。これが特異メソッド。
特異メソッドは何に利用されるの
特異メソッドはSingletonパターンに利用されます。
CENTRAL_REPOSITORY = Object.new def CENTRAL_REPOSITORY.register(target) @registered_objects ||= [] unless @registered_objects.include? target @registered_objects << target end end def CENTRAL_REPOSITORY.unregister(target) @registered_objects ||= [] @registered_objects.delete(target) end def CENTRAL_REPOSITORY.display @registered_objects end p CENTRAL_REPOSITORY.register("hoge") p CENTRAL_REPOSITORY.register("hogehoge") CENTRAL_REPOSITORY.unregister("hoge") p CENTRAL_REPOSITORY.display #=>["hoge"] #=>["hoge", "hogehoge"] #=>["hogehoge”]
CENTRAL_REPOSITORYというObjectクラスに直接属するメソッドとしてregister、unregister、displayが属します。
通常、インスタンスがクラスのメソッドを使いますが、Singletonではインスタンスに直接メソッドが属します。
どんなときに使われるの
1つに限定されたインスタンスを、複数のオブジェクト間で共有するときや、メソッドでのファイルアクセスやシステム内の共通キャッシュテーブルを参照する場合などに利用されます。