Patrones de diseño: patrón Singleton

CoronaEl patrón Singleton es quizás el patrón más conocido, y a la vez el más senzillo de diseñar (en mi opinión). Todo y eso, el concepto y la funcionalidad es a veces un poco complicada de entender. Esta clasificado como un patrón creacional, y es patrón que se implementa en otro patrones.

Antes de explicarlos, hay que refrescar un poco los conceptos de programación orientada a objetos, los necesario para explicar el partón Singleton:

  • Existen clases y objetos, y no son lo mismo. Un objeto es la instancia de una clase.
  • Los atributos y métodos NO estáticos de una clase, son de los objetos.
  • Los atributos y métodos estáticos de una clase, son de la clase.
  • La llamada al constructor de la clase, devuelve un objeto.

El contexto de este patrón es cuando se diseña una aplicación donde tenemos una clase, de la cual sólo puede existir una instancia.

El problema esta en controlar este aspecto, ya que por defecto, la programación orientada objetos da libertad para instanciar tantos objetos de una clase como se desee.

La solución que se aplicaría usando el patrón Singleton, trata de realizar unas modificaciones en la clase para bloquear el método contructor para que no se pueden hacer indefinidos objetos, y también crear un método alternativo para conseguir la instancia única que se desea. Detallando en forma de lista las modificaciones que hay que hacer en una clase para aplicar el patrón Singleton, quería así:

  • Convertir en privado el método constructor.
  • Crear un atributo, privado y estático, que almacenará la única instancia.
  • Crear un método, público y estático, que devolverá la única instancia. Su función será:
    • La primera vez que se llame a este método, creará una instancia, la almacenará en el atributo estático, y la devolverá.
    • Las siguiente veces que se llame, devolverá la instancia almacenada.

El esquema UML sería el siguiente (Los elementos subrallados son elementos estáticos):

Esquema UML del Patrón Singleton

El código de una clase singleton en PHP5, sería así:

<?php
class Ejemplo
{
    // Contenedor Instancia de la Clase
    private static $_instance;
 
    // Constructor privado; previene creacion de objetos via new
    private function __construct()
    {
        echo 'Soy el constructor';
    }
 
    // EL metodo singleton
    public static function getInstance()
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$_instance = new $c;
        }
 
        return self::$_instance;
    }
 
    // Clone no permitido
    public function __clone()
    {
        trigger_error('Clone no se permite.', E_USER_ERROR);
    }
 
}
 
?>

Ejemplos del uso del Patrón Singleton, o ejemplos de cuando es necesario tener una clase que solamente se puede instanciar una vez: la ventana de una aplicación, la conexión a la base de datos, el sistema de logs, o de caches, …

7 comentarios en “Patrones de diseño: patrón Singleton

  1. Grandioso post, la verdad me quedo mas claro el significado y el uso de la palabra reservada “static”.

    + 10 (y).

  2. Por fin entendí que es un patrón de diseño!!!!
    Cuando cree mi blog y te lo envíe te acordarás de este comentario, mil gracias por tu conocimiento.

  3. Hey Bob, this is an awesome taotriul and gives me a lot to think about. One thing I am having trouble figuring out is how to implement transitions between States.In a real game situation, the dwarf would have to actually leave the mine and that would take some time before you could switch to the next State. Another example would be a character has a Jump State and he needs to transition to the Fall State. Another might be a character is in a Running State and then wants to Throw a Punch State or Take Damage State. Any clues to implement this?My idea was to have transition states, but this seems like it would add up. Start Jump State, Jump State, Fall State, Land State This seems to build up way too fast and become way too complicated.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>