This is an old revision of the document!
Contexto: Supongamos una clase Logger, utilizada para registrar las operaciones realizadas en un sistema. Un uso de esta clase se muestra a continuación:
void f() { Logger log = new Logger(); log.println("Ejecutando f"); ... } void g() { Logger log = new Logger(); log.println("Ejecutando g"); ... } void h() { Logger log = new Logger(); log.println("Ejecutando h"); ... }
Problema: En el código anterior, cada método que necesita registrar eventos crea su propia instancia de Logger
. Sin embargo, nos gustaría que todos los usos de Logger
apuntaran a la misma instancia de la clase. En otras palabras, no queremos una proliferación de objetos Logger
. En cambio, nos gustaría que existiera, como máximo, una única instancia de esta clase y que se utilizara en todas las partes del sistema que necesitan registrar algún evento. Esto es importante, por ejemplo, si el registro de eventos se realiza en archivos. Si es posible la creación de varios objetos Logger
, cada nuevo objeto instanciado sobrescribirá el archivo anterior creado por otros objetos del tipo Logger
.
Solución: La solución para este problema consiste en transformar la clase Logger
en un Singleton. Este patrón de diseño define cómo implementar clases que tendrán, como su propio nombre indica, como máximo una instancia. A continuación, mostramos la versión de Logger que funciona como un Singleton:
class Logger { private Logger() {} // prohíbe a los clientes llamar a un new Logger() private static Logger instance; // instancia única public static Logger getInstance() { if (instance == null) // 1a vez que se llama a getInstance instance = new Logger(); return instance; } public void println(String msg) { // registra msg en la consola, pero podría ser en archivo System.out.println(msg); } }