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

  1. Variable estática uniqueInstance: Esta variable contiene la única instancia de la clase Singleton.
  2. Constructor privado: El constructor es privado para evitar que se creen instancias de la clase desde fuera.
  3. 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

  1. Variable de clase _instance: Esta variable contiene la única instancia de la clase Singleton.
  2. 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:

  1. Crea una clase Logger que siga el patrón Singleton.
  2. 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:

  1. 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

  1. No hacer el constructor privado: Esto permite la creación de múltiples instancias.
  2. 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á.

© Copyright 2024. Todos los derechos reservados