プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

特異メソッドとその用途Singletonパターン

特異メソッドはこんな感じ

message = “Hellodef 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つに限定されたインスタンスを、複数のオブジェクト間で共有するときや、メソッドでのファイルアクセスやシステム内の共通キャッシュテーブルを参照する場合などに利用されます。