[C#][Patterns] Patrón Singleton
Aunque es un patrón bastante conocido, vamos a explicarlo brevemente y ver como implementarlo en C#.
Definición
Este patrón basicamente viene a expresar que una clase va a tener una única instancia. Partiendo de la base de que se creara única y exclusivamente desde si misma, y tendrá un punto único de acceso a través de una propiedad de dicha clase.
Ejemplo
Vamos a ver varias formas de implementar el patrón:
La primera, es bastante sencilla, tenemos una clase Log, con un constructor privado, que no podrá invocarse desde fuera de si misma, y tenemos una propiedad estática pública, con su correspondiente variable privada.
Bien, en el get de la propiedad, se compruebe si la variable privada tiene valor, y en otro caso la establece.
Ahora un ejemplo utilizando lock para evitar que en un entorno multihilo para que no se acceda a un trozo de código si otro hilo ya ha entrado en dicho fragmento.
Si necesitamos que nuestro constructor lleve acabo alguna tarea pesada, podemos hacer uso de Lazy<T>. En el constructor del objeto Lazy, estamos invocando al constructor privado, y pasando un parámetro true, para llevar a cabo el lock para garantizar que solo se instancia en un único hilo.
Bueno, en cualquiera de las 3 formas, para poder utilizar nuestro objeto singleton:
var logger = Log.Instance
Espero que os sea de utilidad.
PD: gracias a JuanMa por el comentario en twitter, en el que me recordaba que faltaba una nueva comprobación de instance en el ejemplo con Lock.