Como Jorge mencionó en su último post, andamos re-diseñando la arquitectura de gelato cms, para en un par de versiones mudarlo completamente a PHP5 para obtener ventaja de su poderoso motor de OOP y poder hacer un mejor uso de los patrones de diseño.

Por lo que comenzaré con una serie de posts sobre como implementar patrones de diseño con PHP5 y un par de ejemplos un poco más adelante de como aplicarlos en “la vida real” de nuestros proyectos.

El primer patrón con el que iniciaré es el patrón Singleton, el cual considero como la base de la implementación exitosa de muchos patrones.

La teoría nos dice lo siguiente:

El patrón de diseño Singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto.

Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.

Por lo que al usar el patrón Singleton nos aseguramos que SOLO tendremos una misma instancia de nuestra clase.

¿Cómo hacerlo con PHP5?

PHP:
  1. < ?php
  2. class Singleton {
  3.  
  4.     // Una propiedad para tener la instancia de la clase
  5.     private static $instancia;   
  6.  
  7.     // Desde aqui se obtiene la instancia OJO con el static
  8.     public static function getInstance () {
  9.         if (!isset(self::$instancia)) {
  10.             $obj = __CLASS__;
  11.             self::$instancia = new $obj;
  12.         }
  13.         return self::$instancia;
  14.     }
  15.  
  16.     // Se crean los metodos requeridos
  17.     public function accion() {
  18.         echo "Objeto unico";
  19.     }   
  20.  
  21.     // Privado se previene la creacion via new
  22.     private function __construct() { }   
  23.  
  24.     // Para evitar la clonacion de este objeto
  25.     private function __clone() {
  26.         throw new Exception('No se permite clonar');
  27.     }
  28. }
  29. ?>

Y para utilizarlo:

PHP:
  1. < ?php
  2. include("singleton.php");
  3. $prueba = Singleton::getInstance();
  4. $prueba->accion();
  5. ?>

Nos leemos en la siguiente entrega :P