Patrón Singleton

El patrón Singleton asegura que solo haya una instancia de una clase y proporciona un punto de acceso global a esa instancia. En el contexto de los videojuegos, el Singleton es útil para gestionar recursos compartidos, configuraciones globales, y otros casos en los que se necesita un acceso único a una instancia de la clase.

📝 Ventajas

  • Acceso único: Proporciona un punto de acceso único a una instancia, lo que facilita la gestión de recursos y configuraciones compartidos.
  • Simplicidad: Es una forma simple y efectiva de manejar objetos que necesitan ser únicos en todo el juego.
  • Persistencia: Puedes utilizar el Singleton para almacenar datos que deben persistir entre diferentes escenas del juego.

🚧 Desventajas

  • Dependencia excesiva: El uso excesivo de Singletons puede crear dependencias complejas y dificultar la mantenibilidad del código.
  • Dificultad en pruebas unitarias: Los Singletons complican las pruebas unitarias debido a su naturaleza global.
  • Problemas con la escalabilidad: En aplicaciones grandes y escalables, el uso de Singletons puede limitar la capacidad de paralelización y escalabilidad del sistema.

🎮 Uso en videojuegos

  • Gestión de recursos compartidos: Por ejemplo, manejar el sistema de sonido, la configuración del juego, el control de sesiones.
  • Comunicación entre componentes: Facilitar la comunicación entre diferentes partes del juego que necesitan acceder a la misma instancia de un objeto.
  • Diseño del juego: Gestionar el estado del juego, configuraciones globales, y otras características que deben ser únicas.

🤔 Preguntas para evaluar si es el correcto

  1. ¿Es realmente necesario que la instancia sea única? Si no es necesario que el objeto sea único, podrías considerar otros patrones.
  2. ¿El objeto requiere un acceso global? Si necesitas acceder al objeto desde cualquier parte del juego, el Singleton puede ser una buena opción.
  3. ¿Puedes implementar una solución más modular? Si puedes reemplazar el Singleton con una estructura más modular, es probable que sea una mejor opción.
  4. ¿Es necesario que el objeto persista entre escenas? Si el objeto necesita persistir entre escenas, el Singleton puede ser una buena opción.

💡 Sugerencias adicionales

  • Usa ScriptableObjects para Datos y Configuraciones: Para datos y configuraciones estáticos, considera usar ScriptableObjects en lugar de Singletons.
  • Documenta el uso: Asegúrate de que esté claramente documentado dónde y cómo se utiliza el Singleton, para evitar malas prácticas y mantener la coherencia en el código.
  • Evita depender demasiado de singletons: Si encuentras que tu código depende demasiado de Singletons, es posible que debas reconsiderar tu diseño para hacerlo más modular y escalable.
Patrón Singletón en Unity
Patrón Singletón en Unity

🖥️ Código fuente (ejemplo)

using UnityEngine;

public class GameManager: MonoBehaviour
{
    public static GameManager Instance { get; private set; }

    private void Awake()
    {
        // Si no hay una instancia existente, establece la actual como la única instancia
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            // Si ya existe una instancia, destruye el nuevo objeto
            Destroy(gameObject);
        }
    }

    private void OnEnable()
    {
        // Asegúrate de que solo haya una instancia al cargar la escena
        if (Instance != this)
        {
            Destroy(gameObject);
        }
    }
}