Singleton
# Singleton

En ingeniería de software, singleton o instancia única es un patrón de diseño que restringe la creación a un único objeto la creación de objetos pertenecientes a una clase y asegura de que sólo haya esta instancia única.

Ademas de garantizar que una clase solo tenga una instancia, proporcionar un punto de acceso global a ella.

El patrón singleton se implementa creando en nuestra clase un método que crea una instancia del objeto solo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con modificadores de acceso como protegido o privado).

La instrumentación del patrón puede ser delicada en programas con múltiples hilos de ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no existe todavía, solo uno de ellos debe lograr crear el objeto. La solución clásica para este problema es utilizar exclusión mutua en el método de creación de la clase que implementa el patrón.

Las situaciones más habituales de aplicación de este patrón son aquellas en las que dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o un archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible para todos los demás objetos de la aplicación.

Los críticos consideran al singleton como un anti-patrón utilizando en escenarios donde no es beneficioso, introduce restricciones innecesarias donde una única instancia de una clase no es realmente requerida y agrega un estado global en la aplicación.

El patrón singleton provee una única instancia global gracias a que:

* La propia clase es responsable de crear la única instancia. Por medio de su método constructor.
* Permite el acceso global a dicha instancia mediante un método de clase.
* Declara el constructor de clase como privado para que no sea instanciable directamente.
* Al estar internamente autoreferenciada, en lenguajes como Java, el recolector de basura no actúa.

## Ejemplo de implementación

### ActionScript 3

Una implementación del patrón singleton en ActionScript es la siguiente:

### Autoit

Una implementación del patrón singleton en Autoit es la siguiente:

### C#

Un ejemplo correcto de inicialización diferida y segura en entornos multi-hilo en C# sería:

### C++

Una solución posible en C++ (conocida como el singleton de Meyers) en la cual el singleton es un objeto local estático (notar que esta solución no es segura en programas multi-hilo):

### D

Una posible implementación en D sería:

### Delphi

Esta implementación ha sido sacada de y está basada en la sobreescritura de los métodos NewInstance y FreeInstance que se hereda de la clase TObject, la madre de todos los objetos en Embarcadero Delphi.

Y su implementación sería así:

### Java

La implementación más usual en el lenguaje de programación Java es la siguiente:

Un ejemplo correcto de inicialización diferida. Se deja para comentar un error común en Java al no tener en cuenta la sincronización de métodos.

Si queremos reducir el coste de la sincronización, se realiza la comprobación de la instancia antes de invocar el método "createInstance"; también es posible hacerlo en un único método de la siguiente manera :

Para asegurar que se cumpla el requerimiento de "única instancia" del singleton; la clase debería producir un objeto no clonable:

Entonces, se debería impedir la clonación sobreescribiendo el método "clone" de la siguiente manera:

Otra cuestión a tener en cuenta es que los métodos (o la clase) deberían ser declarados como: final para que no puedan ser sobreescritos.

Existe otra implementación menos conocida, pero con mayores ventajas dentro de Java que es la siguiente:

Este enfoque es thread-safe y serializable, garantizado por la implementación de enum.

Ejemplo de uso:

### Javascript

Una implementación del patrón singleton en Javascript es la siguiente:

### Objective C

Una sencilla implementación del patrón Singleton para el lenguaje Objective C es:

Otra forma mejor utilizando GCD es:

### Perl

Como es habitual en Perl, hay más de un forma de hacerlo. De entre varias posibilidades, podemos señalar esta:

### PHP

Un ejemplo de implementación del patrón singleton en PHP sería la siguiente:

### Python

El siguiente es un ejemplo de implementación de Singleton en Python (tampoco es segura en la programación multi-hilo):

Y otra posibilidad interesante es implementarlo como una metaclase:

### Visual Basic. NET

Una implementación del patrón singleton en Visual Basic .NET es la siguiente:

## Patrones relacionados

* Abstract Factory: muchas veces son implementados mediante singleton, ya que normalmente deben ser accesibles públicamente y debe haber una única instancia que controle la creación de objetos.
* Monostate: es similar al singleton, pero en lugar de controlar el instanciado de una clase, asegura que todas las instancias tengan un estado común, haciendo que todos sus miembros sean de clase.
