Introducción
El patrón Singleton es uno de los patrones de diseño creacionales más conocidos. Su objetivo principal es asegurar que una clase tenga una única instancia y proporcionar un punto de acceso global a esa instancia.
Características Clave del Patrón Singleton
- Única Instancia: Garantiza que solo exista una instancia de la clase.
- Acceso Global: Proporciona un punto de acceso global a la instancia.
Implementación del Patrón Singleton
Ejemplo en Java
A continuación, se presenta una implementación básica del patrón Singleton en Java:
public class Singleton { // Variable estática que contiene la única instancia del Singleton private static Singleton uniqueInstance; // Constructor privado para evitar la creación de instancias desde fuera private Singleton() {} // Método público estático que devuelve la única instancia del Singleton public static Singleton getInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } }
Explicación del Código
- Variable estática
uniqueInstance
: Esta variable contiene la única instancia de la claseSingleton
. - Constructor privado: El constructor es privado para evitar que se creen instancias de la clase desde fuera.
- Método
getInstance
: Este método devuelve la única instancia de la clase. Si la instancia no existe, se crea una nueva.
Ejemplo en Python
A continuación, se presenta una implementación básica del patrón Singleton en Python:
class Singleton: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super(Singleton, cls).__new__(cls) return cls._instance
Explicación del Código
- Variable de clase
_instance
: Esta variable contiene la única instancia de la claseSingleton
. - Método
__new__
: Este método se llama antes de__init__
y se encarga de crear una nueva instancia si no existe.
Ejercicios Prácticos
Ejercicio 1: Implementación Básica
Objetivo: Implementar el patrón Singleton en un lenguaje de tu elección.
Instrucciones:
- Crea una clase
Logger
que siga el patrón Singleton. - La clase debe tener un método
log(message)
que imprima el mensaje en la consola.
Solución (en Java):
public class Logger { private static Logger instance; private Logger() {} public static Logger getInstance() { if (instance == null) { instance = new Logger(); } return instance; } public void log(String message) { System.out.println("Log: " + message); } }
Ejercicio 2: Singleton con Inicialización Temprana
Objetivo: Implementar el patrón Singleton con inicialización temprana.
Instrucciones:
- Modifica la clase
Logger
para que la instancia se cree en el momento de la declaración.
Solución (en Java):
public class Logger { private static final Logger instance = new Logger(); private Logger() {} public static Logger getInstance() { return instance; } public void log(String message) { System.out.println("Log: " + message); } }
Errores Comunes y Consejos
Errores Comunes
- No hacer el constructor privado: Esto permite la creación de múltiples instancias.
- No manejar la concurrencia: En entornos multihilo, es posible que se creen múltiples instancias si no se maneja correctamente.
Consejos
- Usar inicialización temprana: Si el costo de creación de la instancia no es significativo, la inicialización temprana puede simplificar la implementación.
- Sincronización en entornos multihilo: Asegúrate de que el método
getInstance
esté sincronizado para evitar problemas en entornos multihilo.
Conclusión
El patrón Singleton es una herramienta poderosa para asegurar que una clase tenga una única instancia y proporcionar un punto de acceso global a esa instancia. Aunque su implementación es sencilla, es importante tener en cuenta los posibles problemas de concurrencia y seguir las mejores prácticas para evitar errores comunes.
En el próximo tema, exploraremos el patrón Factory Method, que proporciona una manera de crear objetos sin especificar la clase exacta del objeto que se creará.
Curso de Patrones de Diseño de Software
Módulo 1: Introducción a los Patrones de Diseño
- ¿Qué son los Patrones de Diseño?
- Historia y Origen de los Patrones de Diseño
- Clasificación de los Patrones de Diseño
- Ventajas y Desventajas de Usar Patrones de Diseño
Módulo 2: Patrones Creacionales
- Introducción a los Patrones Creacionales
- Singleton
- Factory Method
- Abstract Factory
- Builder
- Prototype
Módulo 3: Patrones Estructurales
Módulo 4: Patrones de Comportamiento
- Introducción a los Patrones de Comportamiento
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
Módulo 5: Aplicación de Patrones de Diseño
- Cómo Seleccionar el Patrón Adecuado
- Ejemplos Prácticos de Uso de Patrones
- Patrones de Diseño en Proyectos Reales
- Refactorización Usando Patrones de Diseño
Módulo 6: Patrones de Diseño Avanzados
- Patrones de Diseño en Arquitecturas Modernas
- Patrones de Diseño en Microservicios
- Patrones de Diseño en Sistemas Distribuidos
- Patrones de Diseño en Desarrollo Ágil