x
1

Singleton



En ingeniería de software, singleton o instancia única es un patrón de diseño que permite 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 solo tenga una instancia y 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.[1][2]

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

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

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

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

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):

Una posible implementación en D sería:

Esta implementación ha sido sacada de [1] 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í:

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 [2]:

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:

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

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

Otra forma mejor utilizando GCD es:

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

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

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:

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



Escribe un comentario o lo que quieras sobre Singleton (directo, no tienes que registrarte)


Comentarios
(de más nuevos a más antiguos)


Aún no hay comentarios, ¡deja el primero!