No soy un enemigo de los singleton, pero sé que se abusan y por esa razón quiero aprender a evitar usarlos cuando no los necesite.Necesito ayuda para evitar el uso de un Singleton
Estoy desarrollando una aplicación multiplataforma (Windows XP/Vista/7, Windows Mobile 6.x, Windows CE5, Windows CE6). Como parte del proceso, estoy rediseñando el código en proyectos separados, para reducir la duplicación de código y, por lo tanto, la posibilidad de corregir los errores del sistema inicial.
Una parte de la aplicación que se separa es bastante simple, es un administrador de perfiles. Este proyecto es responsable de almacenar perfiles. Tiene una clase Profile
que contiene algunos datos de configuración que utilizan todas las partes de la aplicación. Tiene una clase ProfileManager
que contiene Profiles
. El ProfileManager
leerá/guardará Profiles
como archivos XML separados en el disco duro, y permitirá que la aplicación recupere y configure el "activo" Profile
. Sencillo.
En la primera compilación interna, la GUI era la SmartGUI antipatrón. Era una implementación de WinForms sin MVC/MVP realizada porque queríamos que funcionara antes en lugar de estar bien diseñada. Esto condujo a ProfileManager
siendo un singleton. Esto era así desde cualquier lugar de la aplicación, la GUI podía acceder al Profile
activo.
Esto significa que podría ir a ProfileManager.Instance.ActiveProfile
para recuperar la configuración de diferentes partes del sistema según sea necesario. Cada GUI también podía hacer cambios en el perfil, por lo que cada GUI tenía un botón para guardar, por lo que todos tenían acceso al método ProfileManager.Instance.SaveActiveProfile()
también.
No veo nada de malo en el uso del singleton aquí, y porque no veo nada de malo en él, sin embargo, sé que los singletons no son ideales. ¿Hay alguna manera mejor de manejar esto? ¿Se debería pasar una instancia de ProfileManager a cada controlador/presentador? Cuando se crea el ProfileManager, deben crearse otros componentes principales y registrarse en los eventos cuando se cambian los perfiles. El ejemplo es bastante simple, y probablemente sea una característica común en muchos sistemas, así que piense que este es un excelente lugar para aprender a evitar los singletons.
P.s. Tengo que compilar la aplicación contra Compact Framework 3.5, que limita muchas de las clases normales de .Net Framework que se pueden usar.
Tal vez me quede atrapado en mis viejos hábitos, pero veo esto como un buen ejemplo de dónde se debe utilizar un Singleton. –
Esto realmente suena como el caso ideal para una instancia singleton. – msarchet
Gracias por todas las respuestas, parece que este es un lugar apropiado para usar un Singleton. Se tendrán en cuenta los comentarios sobre la inyección de Factory/Dependency, sin embargo, como esta aplicación se ejecutará en segundo plano, es probable que la deje como singleton tanto por la simplicidad como por el rendimiento. – JonWillis