Ver Mensaje Individual
  #5 (permalink)  
Antiguo 07/03/2006, 19:22
HerSAn
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años
Puntos: 2
Ok, aqui va una explicacion no oficial de lo que es el singleton y como funciona. espero que te sirva de referencia rapida.
Propósito:
Garantiza que una clase tenga una instancia, y proporciona un punto de acceso global a ella.
En tu caso, tienes una clase que gestiona las operaciones con tu RDBMS. Y como comentas tu necesidad es que las clases que usan dicho objeto, puedan acceder a una sola instancia de la misma para no estar creado nuevas conexiones en cada llamada al objeto. Bien veremos con un ejemplo sencillo como podemos resolver eso con el patrón singleton.

Estructura:
El patrón en términos de UML puede lucir como sigue

Si te das cuenta la clase implementa un método que nos permite obtener una sola instancia, mediante un llamado de la clase así si misma, veamos ahora con un ejemplo sencillo en php. En el que se requiere un objeto que funcione como un registro de datos el cual pueda ser accedido de forma global por otro objetos, a la clase que implementa esta idea la he llamado SingletonLista en términos de php seria algo como sigue:

Implementación:
Código PHP:
/**
* Clase que implementa el patrón singleton
*/
class SingletonLista
{
  var 
$elemento null;
  
  function 
SingletonLista(){
    
$this->elemento = array();
  }
  
  function 
agregarElemento($elmt=null)
  {
    if (isset(
$elmt)){
      
$this->elemento[] = $elmt;
    }
    return 
false;
  }
  
  function &
unicaInstancia()
  {

    static 
$instancia null;

    if (!
is_object($instancia)){
      
$instancia = new SingletonLista();
    }
    return 
$instancia;
  }

La clase solo tiene una variable de arreglo, donde almacenara la información que le pasen las clases que la requieran, ahora para usarla creamos dos clase que solo tiene un método con el que agregan datos a la clase SingletonLista.

Código PHP:
/**
* close A
*/
class A
{
  function 
A()
  {
    
$this->lista = &SingletonLista::unicaInstancia();
  }
  
  function 
agregar($elmt)
  {
    
$this->lista->agregarElemento($elmt);
  }
}

/**
* Clase B
*/
class B
{
  function 
B()
  {
    
$this->lista = &SingletonLista::unicaInstancia();
  }

  function 
agregar($elmt)
  {
    
$this->lista->agregarElemento($elmt);
  }

Bien ahora probaremos nuestro singleton:
Código PHP:
$a =& new A();
$b =& new B();

$a->agregar('uno');
$a->agregar('dos');
$a->agregar('tres');

print_r($a);
print_r($b); 
En el ejemplo creamos dos objetos uno a, y otro b los dos tiene un metodo que agrega elementos a la lista, finalmente imprimimos los dos objetos y obtenemos lo siguiente:
Código:
a Object
([lista] => singletonlista Object
        (
            [elemento] => Array
                (
                    [0] => uno
                    [1] => dos
                    [2] => tres
                )

        )

)

b Object
([lista] => singletonlista Object
        (
            [elemento] => Array
                (
                    [0] => uno
                    [1] => dos
                    [2] => tres
                )

        )

)
Como puedes ver, el objeto ha sido un existo, el contenido de nuestra clase SingletonLista están disponibles para ambos objetos ahora supongamos que un momento después nuestro objeto b agrega otro elemento:
Código PHP:
$b->agregar('cinco');

print_r($a);
print_r($b); 
El resultado seria el siguiente:
Código:
a Object
([lista] => singletonlista Object
        (
            [elemento] => Array
                (
                    [0] => uno
                    [1] => dos
                    [2] => tres
                    [3] => cinco
                )

        )

)
b Object
([lista] => singletonlista Object
        (
            [elemento] => Array
                (
                    [0] => uno
                    [1] => dos
                    [2] => tres
                    [3] => cinco
                )

        )

)
Y sorpresa el nuevo elemento agregado por b ahora también esta disponible para a.
Con esta idea, puedes agregar un método estático a la clase que estas usando para tratar con tu RDBMS y solucionar tu problema, también puedes retocar la clase SingletonLista y almacenar objetos únicos, pero eso lo dejamos para otra ocasión para no introducir complicaciones a la explicación.
__________________
Saludos!
Mty-NL..