Patrón Singleton



El Patrón Singleton sirve para cuando buscamos restringir la creación de instancias de un objeto, obligando que solo se pueda crear una única instancia. Permite crear un objeto que va a ser accedido por diferentes partes de nuestra aplicación. Un claro ejemplo de es una conexión de base de datos.

Problema que resuelve este patrón: cuando no se puede tener más de una instancia de una clase, y cuando se necesita controlar acceso a una clase. Cuando se necesita restringir que una clase solo devuelva una única instancia de ella lo largo de toda la ejecución del programa.

La forma de proceder del patrón es la siguiente: si se solicita una instancia del objeto:

a)      Si no existe (la primera vez que se usa) se crea la instancia.
b)      Si existe una instancia (es la segunda o más vez que se usa), devuelvo la existente, todas las veces que se me solicite.
c)      El constructor de la clase debe permanecer "anulado" definiéndolo como "privado". De esta forma se asegura que no se puedan crear instancias de forma directa y solo se permite a través del método "getInstancia()"

Estructura:
         Cambio el constructor a privado.
         Hago que la clase no pueda ser heredada.
         Agrego una variable estática del mismo tipo de la clase donde está contenida. (instancia)
         Agrego un método estático que retorne la única instancia. Donde su función sea que la primera vez que se llame al método cree una instancia, la almacene en el atributo estático y lo devuelva. Y las siguientes veces que se llame devuelva la instancia almacenada.(GetInstance)
         No creo el objeto hasta que sea necesario (Lazy Creation)
         Agrego el código necesario para no crear dos instancias en distintos thread.



Ejemplo:
Tenemos una clase BaseDeDatos que nos devuelve un objeto llamado "bd" una vez creada la conexión con la base de datos. En vez de permitir que las aplicaciones usen libremente la clase y puedan crear tantas instancias del objeto "Base de Datos" como aplicaciones y accesos a bases existan, se decide restringir la creación a una sola instancia y esta será compartida y usada por todos.

Ejemplo:
En un sistema operativo necesitamos tener exactamente: Una única cola de impresión, un único sistema de ficheros, etc.

Ejemplo:
La oficina del presidente de los estados unidos es un "singleton - ejemplar único". La constitución de los estados unidos especifica los medios por los que un presidente es elegido, limita la duración del mandato, y define el orden de sucesión, Como resultado, puede haber como máximo un presidente activo en todo momento. El título, "El Presidente de Los Estados Unidos" es un punto de acceso global que identifica a la persona en la oficina.




Ventajas:
Se tiene controlada la creación de objetos y podremos además disminuir el uso de memoria al tener una sola instancia que se usa en todo el contexto de la aplicación. Evita que nuestro sistema, en un momento dado, tenga innumerables y descontroladas conexiones a la base de datos, consumiendo recursos. Ayuda a crear clases reusables y no depender de variables globales. No necesitamos una nueva instancia cada vez, consiguiendo con ello una mejora en el rendimiento. Reduce el espacio de nombres.

Nota: En PHP el patrón solo es útil cuando instanciemos varias veces una clase en un script porque al terminar la ejecución de este, las variables y valores son borrados (incluidos objetos), por consiguiente en cada ejecución del script se crean nuevas instancias.