April 05, 2008

Patrones de diseño: Singleton

El patrón de diseño Singleton está pensado para restringir la creación de objetos de una clase determinada garantizando que sólo exista una instancia de dicha clase y proporcionar un punto de acceso global a ella.

Un ejemplo de utilización de este patrón podría ser una clase para la conexión a la base de datos. Mediante esta clase evitaremos que haya mas de una conexión abierta a la vez en cada aplicación y en cada acceso a la base de datos que necesitemos.

Para crear esta clase utilizando el patrón Singleton tendremos en cuenta lo siguiente:

  • Necesitamos un método constructor privado de forma que nadie, salvo ella misma, pueda crear una instancia de esta clase.
  • Necesitaremos un atributo estático privado que contendrá la única instancia a esta clase.
  • Y por último, un método estático público que creará la instancia de la clase en caso de que se llame por primera vez almacenándola en el atributo estático y luego la devolverá mediante un return.

La implementación básica en PHP sería la siguiente:

<?php
Class Conexion {
  static private $thisInstance = null;
 
  private function __construct() {
    ...
  }
 
  static public function getInstance() {
     if(self::$thisInstance == null)
        self::$thisInstance = new Conexion();
     return self::$thisInstance;
   }
....
}
 ?>

Cuando en alguna parte de la aplicación necesitemos acceder a la base de datos, recuperaremos la instancia de la clase y trabajaremos con ella.

// Obtendremos la instancia
$db = new Conexion::getInstance();

// Y ya podremos trabajar con ese objeto
$db->exec("select * from clientes");
...

Este patrón suele ser utilizado en clases que acceden a un recurso único (fichero, base de datos, etc...) de forma que podremos controlar la creación de objectos que acceden a dichos recursos al tener una sola instancia.