Singleton, aunque suene a marca de tenis, corresponde realmente a un patrón de diseño de clases en el paradigma de la programación orientada a objetos.
Este patrón o metodología de funcionamiento se da a la hora de diseñar las clases, y nos permite que exista solo una única instancia(objeto) de una clase.
Aunque singleton en inglés se traduzca como semifallo. El significado más parecido es single: único o sencillo, haciendo alusión a el acceso a una única instancia.
Pero me pregunto ¿ para qué queremos realizar esto, que finalidad tiene ?
La respuesta es sencilla: garantizar que siempre accedemos al mismo objeto o instancia.
¿ Que ventajas me aporta ?
Acceder de manera universal y constante durante el transcurso del programa al los métodos y el estado del objeto(instancia).
Y como se supone que lo puedo usar:
Cuando necesite que una parte de la aplicación que realmente son un conjunto de objetos en memoria o disco, accedan de manera única a dicho objeto. Es decir, centralizamos el objeto para el resto del programa (desde cualquier parte).
Ejemplo: Acceso a un objeto de seguridad que almacene datos confidenciales. O un log, o unos parámetros de la aplicación globales.
¿ Como lo represento ?
Como clase
Ejemplo de uso real:
Public Class Singleton Private Sub New() End Sub ‘ IMPORTANTISMO: Variable privada de acceso interno a la instancia singleton Private Shared _instancia As Singleton Public Shared ReadOnly Property Instancia() As Singleton ‘ Importante el uso del if es vital dentro de la clase para comprobar si no existe la instancia, puesto que de existir no crea el objeto, es ahí donde radica la esencia del patrón. Get If _instancia Is Nothing Then _instancia = New Singleton End If Return _instancia End Get End Property End Class |
Un ejemplo sencillo de un contador de visitas, accesible desde cualquier parte del programa mediante la llamada al metódo IncrementarContador
public sealed class Singleton { // Almacenamos las visitas del sitio en una variable private int contador = 0; private static volatile Singleton instance = null; private Singleton() {} public static int IncrementarContador() { if (instance == null) instance = new Singleton(); return instance.contador++; } } |
Si uso desde el exterior por el programa: Singleton.IncrementarContador ();
Este método es de tipo set, pero la funcionalidad de la clase podría verse afectada por mas propiedades, y métodos.
En este sencillo ejemplo no se contempla la exclusión. Es decir, que dos objetos accedan al mismo dato. Para ello existen variantes de este patrón.
Resumiendo:
Utilizaremos singleton en aquellas aplicaciones 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.