Singleton es un patrón de diseño creacional que garantiza que tan solo exista un objeto de su tipo y proporciona un único punto de acceso a él para cualquier otro código.
El patrón tiene prácticamente los mismos pros y contras que las variables globales. Aunque son muy útiles, rompen la modularidad de tu código.
No se puede utilizar una clase que dependa del Singleton en otro contexto. Tendrás que llevar también la clase Singleton. La mayoría de las veces, esta limitación aparece durante la creación de pruebas de unidad.
Identificación: El patrón Singleton se puede reconocer por un método de creación estático, que devuelve el mismo objeto guardado en caché.
Singleton ingenuo (hilo único)
Es muy fácil implementar un Singleton descuidado. Tan solo necesitas esconder el constructor e implementar un método de creación estático.
Singleton.java: Singleton
DemoSingleThread.java: Código cliente
OutputDemoSingleThread.txt: Resultados de la ejecución
Singleton ingenuo (multihilo)
La misma clase se comporta de forma incorrecta en un entorno de múltiples hilos. Los múltiples hilos pueden llamar al método de creación de forma simultánea y obtener varias instancias de la clase Singleton.
Singleton.java: Singleton
DemoMultiThread.java: Código cliente
OutputDemoMultiThread.txt: Resultados de la ejecución
Singleton con seguridad en los hilos y carga diferida
Para arreglar el problema, debes sincronizar hilos durante la primera creación del objeto Singleton.
Singleton.java: Singleton
DemoMultiThread.java: Código cliente
OutputDemoMultiThread.txt: Resultados de la ejecución
¿Quieres más?
Existen variedades aún más especiales del patrón Singleton en Java. Consulta este artículo para saber más: