Résumé des patrons de conception expliqués dans le livre Design Patterns in Ruby
View the Project on GitHub armandfardeau/design-patterns-in-ruby
Nous avons besoin d’avoir une seule instance d’une certaine classe dans toute l’application.
Dans le modèle Singleton, l’accès au constructeur est limité, de sorte qu’il ne peut pas être instancié. Ainsi, la création de l’instance unique se fait à l’intérieur de la classe et est tenue dans une variable de classe, et on peut y accéder par l’intermédiaire d’un “getter” à travers l’application.
Considérons l’implémentation d’une classe “logger” :
class SimpleLogger
attr_accessor :level
ERROR = 1
WARNING = 2
INFO = 3
def initialize
@log = File.open("log.txt", "w")
@level = WARNING
end
def error(msg)
@log.puts(msg)
@log.flush
end
def warning(msg)
@log.puts(msg) if @level >= WARNING
@log.flush
end
def info(msg)
@log.puts(msg) if @level >= INFO
@log.flush
end
end
La journalisation (logging) est une fonctionnalité utilisée dans l’ensemble de l’application, il est donc logique qu’il n’existe qu’une seule instance de l’enregistreur. Nous pouvons nous assurer que personne n’instancie deux fois la classe `SimpleLogger’ en rendant son constructeur privé :
class SimpleLogger
# Lots of code deleted...
@@instance = SimpleLogger.new
def self.instance
return @@instance
end
private_class_method :new
end
SimpleLogger.instance.info('Computer wins chess game.')
Nous pouvons obtenir le même comportement en incluant le module Singleton
, de sorte que nous pouvons éviter de dupliquer le code si nous créons plusieurs singletons :
require 'singleton'
class SimpleLogger
include Singleton
# Lots of code deleted...
end