Partrón Singleton | Singleton Pattern

Repo: https://github.com/umarquez/100DaysOfC0D3/tree/master/11-sigleton

Los patrones de diseño son unas técnicas para resolver problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces. https://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o

Una característica que nos diferencia de muchos animales es que podemos crear herramientas, aunque algunos animales también son capaces de hacerlo el nivel de sofisticación que hemos alcanzado ha sido, entre otras cosas, gracia a que somos capaces de documentar y reproducir procesos, además de poder adaptarlos a situaciones para las que no fueron originalmente pensados. Parte de esto consiste en observar los problemas comunes y realizar modelos para tratar de solucionarlos, estos modelos pueden ser optimizados para ser más eficientes y precisos.

Pensemos en la manera como las bases de datos son capaces de procesar queries de manera simultanea sobre un mismo conjunto de datos, o como los servidores web atienden conexiones persistentes sin “confundirse”, otro ejemplo es el como los motores de videojuegos crean y procesan cada evento, como las leyes físicas, las colisiones de objetos, el spawn de enemigos o la inteligencia artificial de este, incluso el clima.

Muchos de estos problemas (algunos más o menos comunes que otros) pueden ser abordados utilizando uno o varios patrones de diseño, dependerá del contexto de cada caso la elección más adecuada, o incluso siendo posible una combinación de estos.

Singleton es un patrón de diseño (de los más conocidos) que sirve para asegurar que solo una instancia de cierto tipo será inicializada durante toda la ejecución y que cada vez que esta sea solicitada siempre será retornada la misma para todos los casos.

Este patrón podría ser utilizado para compartir una misma sesión entre distintos hilos , por ejemplo: un cliente de una API que requiera autenticación y de la cual podamos consumir datos de forma paralela. Otro ejemplo puede ser para compartir una misma conexión a una base de datos entre diferentes goroutines que estén atendiendo peticiones de manera persistente. En un videojuego, podría ser útil para asegurarnos que varios recolectores almacenen sus recursos en el mismo almacén, si se tratara de un juego de estrategia, por ejemplo.

En Golang existen ciertas consideraciones para para implementar este patrón, especialmente cuando se contará con acceso simultaneo a la instancia a través de varias goroutines, como pudiera ser el caso. Para fines prácticos, en esta ocasión, nosotros implementaremos un caso sencillo y posiblemente más adelante en la serie alguno más complejo.

Ejemplo:

Contamos con un edificio de 6 departamentos y un tanque de agua de 5000 litros, cada departamento tiene 18% de probabilidad de consumir 5 litros cada minuto, todos los departamentos se alimentan del mismo tanque.

¿Podríamos simular este comportamiento y medir el tiempo que tomaría vaciar el tanque?

https://play.golang.org/p/bgE5FDGHvjH