Páginas

jueves, 30 de diciembre de 2010

Patrón de diseño Singleton PHP


En esta entrada hablaremos sobre el Patrón Singleton, veremos su objetivo e implementación.

Que es el Patrón Singleton??

El Patrón Singleton o instancia única es un método que se encarga de garantizar que una clase solo tenga una sola instancia, esto lo lleva a cabo declarando el constructor de nuestra clase privado de manera que no se pueda acceder directamente a este y creando un método por lo general llamado getInstance(), donde declararemos la instancia de nuestra clase.

 Características del Patrón Singleton:

a) La propia clase es la responsable de crear la única instancia, la cual debe garantizar que no se pueda crear ninguna otra (interceptando todas las peticiones para crear nuevos objetos) y proporcionando un solo punto de acceso a ella.
b) Si no se ha creado anteriormente (o sea, es la primera vez que se usa esta clase) se crea la instancia.
c) Si existe ya anteriormente una instancia (es la segunda o más veces que se usa), se retorna la existente todas las veces que se solicite.
d) El constructor de la clase debe declararse como privado para que la clase no pueda ser instanciada directamente.

Implementación del Patrón Singleton:

class Ejemplo
{
   private static $instancia;
   private $contador;
   

   private function __construct()
   {
      echo "He creado un " . __CLASS__ . "\n";
      $this->contador = 0;
   }

   public static function getInstance()
   {
      if (  !self::$instancia instanceof self)
      {
         self::$instancia = new self;
      }
      return self::$instancia;
   }
   
   public function incrementar()
   {
      return ++$this->contador;
   }
   
   public function disminuir()
   {
      return --$this->contador;
   }
}


Como se indico en la teoría el constructor de la clase Ejemplo es privado, de manera que no se puede instanciar directamente la clase, por lo que declaramos un método que se encargue de instanciar  la clase, en este caso  es el método estático getInstance, este método lo que hace es una verificación de que si ya existe una instancia de la clase, sino existe ninguna se crea la instancia y se guarda en el atributo estático de la clase $instancia, y luego se retorna, pero que pasa si ya existe una instancia?? Sencillamente lo que hace es retornar la instancia que ya existía de la misma, veamos  nuestra clase Ejemplo en ejecución.
$instancia = Ejemplo::getInstance();
echo "instancia (incrementar): " . $instancia->incrementar();
$instancia2 = Ejemplo::getInstance();
echo "instancia2 (incrementar): " . $instancia2 ->incrementar();


El resultado por pantalla sería el siguiente:

He creado un Ejemplo
instancia (incrementar): 1
instancia2 (incrementar): 2

Porque si creamos dos instancias diferentes el contador siguió incrementándose en vez de reiniciarse?? Esto porque como se indico en la teoría el Patrón Singleton solo permite una sola instancia de la clase, al retornar la misma instancia el contador de esta no se reinicia y este sigue incrementándose.

Como nota adicional: Muchos cometemos el “error” de implementarle el patrón singleton a nuestras clases de base de datos, esto en un principio se creía que era bueno ya que te creaba una globalización de la instancia de este tipo de clase, con dudas y manos amigas nos indican que lo mejor para este tipo de clases es el patrón registry.
Bueno espero que el articulo sea del agrado de los lectores de este blog de programación saludos y cualquier comentario, critica es aceptada.

No hay comentarios:

Publicar un comentario