2012-02-06 16 views
12

que he estado haciendo un montón de lectura acerca de cómo el uso de clases simples se está convirtiendo en una mala práctica en la programación debido a las dependencias ocultas, difícil de probar, etc, etcSingleton La eliminación

Una gran cantidad de mensajes en el foro he leído han dicho que aún puede mantener la funcionalidad principal de un singleton de solo permitir una instancia sin usar el patrón singleton.

Me preguntaba si alguien podría dar un ejemplo práctico de esto. Una gran cantidad de publicaciones han sugerido utilizar una clase de fábrica para crear instancias únicas donde las dependencias se muestran claramente. Para mí, esto parece tomar varios singletons y combinarlos en un único singleton de fábrica que tendría los mismos problemas.

+6

Los singletons no son intrínsecamente malvados. Sin embargo, usarlos donde no debe hacerlo, especialmente si está realizando su propia gestión del ciclo de vida de los objetos (en lugar de usar un contenedor DI). A menos que necesite FactoryFactory, ¿por qué * no debería * una fábrica ser un singleton? (Esto es más retórico, hay razones reales, pero a menudo no importan). –

+0

Ya sabes, cuando uso Spring Framework para administrar mi ciclo de aplicación, todos los beans que crea son singletons, y también hay solo uno ApplicationContext también (programa principal de Spring).Así que los singletons no son malos, solo debes ocuparte de los problemas que mencionaste (dependencias, capacidad de prueba, etc.) – Luciano

+0

Podría ser beneficioso formular esta pregunta como una pregunta sobre un juego: "son los peores escenarios posibles para el mal uso" de singletons mejor que los peores escenarios posibles de simplemente llamar a new/making COMPLETELY static classes/etc "? La única razón por la que menciono esto es porque cualquier patrón que se pueda usar probablemente se use incorrectamente, por lo que merece la pena preguntar "cuáles limitan los peores resultados posibles". – Dave

Respuesta

2

El problema con el "patrón de singleton" no es realmente con el singleton en sí, sino con el inflexible método de fábrica estático en la clase singleton. Y creo que incluso en el libro de GoF, esto se consideró un ejemplo de cómo se podía acceder a un singleton, no el modelo de implementación definitiva.

Muchos mensajes han sugerido utilizar una clase de fábrica para crear instancias únicas donde las dependencias se muestran claramente. Para mí, , esto parece tomar múltiples singletons y combinarlos en un único singleton de fábrica que tendría los mismos problemas?

La diferencia es que esta única fábrica se convierte en el único punto donde se mantienen las dependencias.

Y, de hecho, la solución generalmente aceptada es utilizar un marco de inyección de dependencia como Spring o Guice que es básicamente una fábrica única con un mecanismo de configuración muy potente y flexible que puede hacer mucho más que gestionar singletons.

1

La solución suele ser la inyección de dependencia. Esto no significa que tenga que tener un marco, solo necesita crear instancias y conectarlas juntas de forma externa a su base de código principal. Uso un módulo que depende de todo lo demás que conecta y configura todos los componentes externamente (a los componentes que están en otros módulos)

Al usar inyección de dependencia, tiene un singleton siempre que solo cree una instancia.

Obviamente, en las pruebas, puede crear muchas instancias incluyendo subclases y simulaciones de interfaces.

0

Un buen ejemplo práctico es el springframework. Crea beans de forma predeterminada como "singleton" (solo una instancia en el contenedor), pero no es necesario que el programador implemente el patrón (constructor privado, método estático getInstance, etc.).