le motif singleton

Définition

Assurer qu’une classe n’a qu’une et une seul instance.

Principe

Pour être sur qu’une classe n’a qu’une instance, en ruby, c’est très simple. Il suffit d’inclure le module singleton dans la classe que l’on souhaite adapter au motif.

L’exemple par le code

La pluspart du temps, le motif singleton est utilisé pour les pool de connexion, les caches et autres objets de configuration ne nécessitant qu’un et une seul instance. Voyons ce que ça donne avec une base de gestionnaire de pool de connexion.

require 'singleton'
class Pool
  include Singleton
  attr_reader :list_free_conn
  def initialize
    @list_free_conn=["connexion1","connexion2"]
  end
  def get_connection
    return @list_free_conn.pop
  end
  def free_connection(connection)
    @list_free_conn.push(connection)
  end
end

C’est assez simple finalement. Dans ce cas, avec include singleton notre objet empeche toute instanciation standard. Un ligne comme celle-ci renverra une execption:

mon_pool = Pool.new

Pour obtenir l’instance unique de notre pool, il faut appeler la méthode insance sur notre objet. Observons cela:

pool = Pool.instance
conn1 = pool.get_connection
pool_2 = Pool.instance
conn2 = pool_2.get_connection
conn3 = pool.get_connection

puts pool
puts pool_2

puts conn1
puts conn2
puts conn3

pool.free_connection(conn1)
puts pool.list_free_conn

Ce qui nous donneras:

#<Pool:0x30046db8>
#<Pool:0x30046db8>
connexion2
connexion1
nil
connexion2

On observe que les deux objet pool et pool_2 on la même référence mémoire, ce sont donc deux pointeurs vers un même objet. Le reste nous le prouve c’est l’objet connexion2 qui est récupéré par le premier pool (pool) alors que l’objet pool_2 récupère lui l’objet connexion1. Du coup quand le pool demande encore une connexion, il n’en reste plus (d’où le nil).