El singleton es un patrón de diseño muy conocido y muy utilizado. Restringe la creación de instancias de una clase para que solo cree una instancia de la clase que lo implementa. Puede ser utilizado de forma global en aplicaciones así que su uso puede ser muy variado, desde acceder a constantes y acumuladores o contadores, hasta la gestión de parámetros de la aplicación.
En este fragmento os presentamos dos formas de crear un singleton para C#. La primera opción es un singleton en el caso más básico.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class SingletonBasico { //Propiedad y constructor privado private static readonly SingletonBasico instance = null; private SingletonBasico() { } //Propiedad publica que da acceso a la clase public static SingletonBasico Instance { get { if(null == instance) instance = new SingletonBasico(); return instance; } } } |
Para prevenir que se acceda a través de diferentes hilos (threads) y genere dos instancias de la misma clase se puede utilizar el singleton multi-hilo (multi-thread) que precisamente hace eso, prevenir la creación de dos o más instancias de un singleton. Es una versión mejorada de la original que solo bloquea cuando se todavía no se ha creado la instancia a la clase, en los demás casos trabaja como un singleton básico. Es muy recomendable utilizar esta implementación aún sin trabajar con multi-hilos desde un inicio.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class SingletonMultiHilo { //Propiedad y constructor privado private static readonly SingletonMultiHilo instance = new SingletonMultiHilo(); private static object syncRoot = new Object(); private SingletonMultiHilo() { } public static SingletonMultiHilo Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) instance = new Singleton(); } } return instance; } } } |
Si quieres saber más sobre los patrones de diseño puedes ver el artículo donde hablamos de ellos o escuchar el podccast donde hablamos del patrón Modelo Vista Controlador.