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).


