Ruby Language Singleton


Exemple

Ruby Standard Library possède un module Singleton qui implémente le modèle Singleton. La première étape de la création d'une classe Singleton consiste à exiger et à inclure le module Singleton dans une classe:

require 'singleton'

class Logger
  include Singleton
end

Si vous essayez d'instancier cette classe comme vous le feriez normalement avec une classe normale, une exception NoMethodError est NoMethodError . Le constructeur est rendu privé pour empêcher que d'autres instances soient créées accidentellement:

Logger.new

#=> NoMethodError: private method `new' called for AppConfig:Class    

Pour accéder à l'instance de cette classe, nous devons utiliser l' instance() :

first, second = Logger.instance, Logger.instance
first == second

#=> true

Exemple de Logger

require 'singleton'


class Logger
  include Singleton

  def initialize
    @log = File.open("log.txt", "a")
  end

  def log(msg)
    @log.puts(msg)
  end
end

Pour utiliser l'objet Logger :

Logger.instance.log('message 2')

Sans Singleton inclure

Les implémentations singleton ci-dessus peuvent également être effectuées sans l'inclusion du module Singleton. Cela peut être réalisé avec les éléments suivants:

class Logger
  def self.instance
    @instance ||= new
  end
end

qui est une notation abrégée pour les éléments suivants:

class Logger
  def self.instance
    @instance = @instance || Logger.new
  end
end

Cependant, gardez à l'esprit que le module Singleton est testé et optimisé, ce qui en fait la meilleure option pour implémenter votre singleton.