He visto a algunas personas en SO al comentar que Singleton Pattern es un antipatrón. Quiero saber por qué ?¿Por qué la implementación de un patrón de Singleton en el código de Java es (a veces) considerado un antipatrón en el mundo de Java?
Respuesta
Prueba
Una de las razones es que los únicos que no son fáciles de manejar con pruebas unitarias. No puede controlar la creación de instancias y, por su propia naturaleza, puede retener el estado en todas las invocaciones.
Por esa razón, el principio de dependency injection es popular. Cada clase se inyecta (configura) con las clases que necesitan para funcionar (en lugar de derivar a través de accesadores singleton) y así las pruebas pueden controlar qué instancias de clase dependientes usar (y proporcionar simulaciones si es necesario).
Los marcos como Spring controlarán el ciclo de vida de sus objetos y a menudo crearán singletons, pero estos objetos se inyectan en sus objetos dependientes por el marco. Por lo tanto, la base de código en sí misma no trata los objetos como singletons.
p. Ej. en lugar de esto (por ejemplo)
public class Portfolio {
private Calculator calc = Calculator.getCalculator();
}
que inyectaría la calculadora:
public class Portfolio {
public Portfolio(Calculator c) {
this.calc = c;
}
}
Por lo tanto el objeto Portfolio
No sabe/cuidado acerca de cómo existen muchos casos de la Calculator
. Las pruebas pueden inyectar un dummy Calculator
que facilita las pruebas.
concurrencia
Por limitación a una instancia de un objeto, las opciones para el roscado son limitados. El acceso al objeto singleton puede tener que estar protegido (por ejemplo, a través de la sincronización). Si puede mantener varias instancias de esos objetos, puede adaptar el número de instancias a los hilos que tiene en ejecución y aumentar las capacidades simultáneas de su base de código.
Entonces, ¿cómo las personas que usan singleton se ocupan de "Prueba" y " Problemas de concurrencia? – Pacerier
Con alguna dificultad. Herramientas como PowerMock pueden proporcionar medios para anular métodos singleton, pero son herramientas complejas que recurren a la manipulación de códigos byte –
Mi opinión personal es que viola el principio de responsabilidad única. Los objetos Singleton son responsables tanto de su propósito como de controlar el número de instancias que producen, lo cual creo que es incorrecto.
Es por eso que muchas personas delegan el control en un objeto de fábrica.
Creo que eso hace que [la interpretación de] SRP sea sospechosa. –
¿De qué manera es sospechoso? – MikePatel
Sospechoso en que esto claramente no es algo que está mal con Singletons, pero la interpretación de SRP indica que sí lo está. SRP (o esta interpretación) parece ser el culpable. –
Hay muchos requisitos que pueda tener en el producto único:
- inicialización perezosa;
- eliminación adecuada;
- alcance (uno por hilo, por ejemplo).
Típicamente, también, tendrá un montón de hijos únicos en su aplicación, y el patrón deSingleton no permite código reutilizable. Por lo tanto, si desea implementar todas estas inquietudes para todos sus singletons, inmediatamente verá su anti-pattern calidad.
Los Singletons como tales no son necesariamente un anti-patrón, pero tienen solo unos pocos beneficios y se convierten en antipatrón cuando se usan incorrectamente (lo que sucede a menudo).
A menudo, los singletons no son singleton en absoluto, sino "variables globales disfrazadas". Además, a menudo se usan cuando la propiedad "única instancia" no es realmente una ventaja. (que de nuevo se equilibra por el hecho de que muchas veces la implementación es incorrecta al mismo tiempo).
Además de eso, pueden ser difíciles de implementar teniendo en cuenta el multihilo (a menudo se hace incorrectamente o de manera ineficiente), y pierden la mayoría de sus beneficios si desea controlar su creación de instancias.
Si desea tener control sobre la creación de instancias, debe hacerlo a mano en algún momento temprano en el programa, pero también podría simplemente crear una instancia de un objeto normal y pasarlo a continuación.
Si el orden de destrucción es preocupante, debe implementarlo manualmente también. Un único objeto automático en la función principal es mucho más limpio y fácil.
[Mutable] Singleton es un anti-patrón de un anti-patrón.
El antipatrón subyacente significativo es el estado global (o el estado ambiente). Con estado global, tiene un gran blog de dependencia en su programa. Esto afecta las pruebas, pero eso es solo una parte de las consecuencias de la mala programación.
En capas, Singleton agrega un nivel completamente innecesario de complejidad a la simple declaración de campos static
mutables.
Mutable static los campos sufren el mismo problema exacto, es un estado global. No veo cómo usar campos estáticos es mejor que un singleton. ¿Alguna información sobre eso? –
@JuanMendes Como digo, las estáticas mutables directas son mejores que las estáticas mutables simples porque no tienen la complejidad inútil. –
Debo revisar las respuestas mejor antes de dejar un comentario. 100% de acuerdo con usted Básicamente es un eufemismo para el estado global, por lo que al llamarlo campos estáticos al menos no intenta embellecerlo. –
Extraño. Parece que la implementación incorrecta de un Singleton es un "antipatrón", no el Singleton en sí mismo.
Creo que hemos olvidado que cada programa tiene que comenzar en alguna parte. Tiene que haber una implementación concreta de cada abstracción, y finalmente cada dependencia se resolverá eventualmente, o su aplicación no sería de mucha utilidad.
La mayoría de los marcos DI permiten crear instancias de una clase como Singleton, simplemente se encarga de eso. Si elige hacer DI usted mismo, inyectar un singleton no es un problema. También se puede probar un Singleton IS, y si está usando DI para inyectarlo, no hace que una clase sea inestable.
IMO, como cualquier otro patrón (incluyendo DI y IoC) es una herramienta. A veces se ajusta, otras veces no.
- 1. Implementación del patrón singleton en Java
- 2. Código de ravioles: ¿por qué un antipatrón?
- 3. ¿Por qué el patrón de Borg es mejor que el patrón de Singleton en Python?
- 4. ¿Por qué el patrón de módulo crea un singleton?
- 5. Uso confuso de sincronizado en Java: ¿patrón o antipatrón?
- 6. Java Singleton patrón
- 7. ¿El INTÉRPRETE es un antipatrón?
- 8. patrón singleton en java. inicialización diferida
- 9. ¿Por qué el mundo .net no tiene servidores de aplicaciones como el mundo de Java?
- 10. ¿Qué es un antipatrón?
- 11. ¿Es un bloque finalmente sin bloque de captura un antipatrón de Java?
- 12. ¿Cuál es la diferencia entre un patrón de Singleton y una clase estática en Java?
- 13. ¿Qué es el signo $ en Java? Por favor, echar un vistazo en el código Java a continuación
- 14. necesito diseño/patrón/estructura ayuda en la codificación de un 'mundo' de Java
- 15. Serializar un objeto Java a código Java?
- 16. Implementación de patrón de eventos de dominio en Java?
- 17. ¿La subversión es externa a un antipatrón?
- 18. ¿En qué situación utilizamos el patrón de fábrica y en qué patrón de Singleton?
- 19. ¿Por qué el compilador de Java a veces permite el desempaquetado de nulo?
- 20. Devuelve el valor de un código Java
- 21. ¿Por qué MVC4 usa el Localizador de servicios antipatrón?
- 22. MVC patrón de código fuente Singleton
- 23. ¿Por qué el espacio non-breaking no es un carácter de espacio en blanco en java?
- 24. ¿Por qué a veces separamos el comportamiento de las clases en Java?
- 25. Java Singleton vs static: ¿hay un beneficio de rendimiento real?
- 26. ¿Cuál es el nombre de este antipatrón?
- 27. Implementación de un algoritmo Star (A *) en Java
- 28. ¿Validar campos tanto en el constructor como en el setter es considerado un código redundante malo?
- 29. ¿Cómo inicializar el singleton basado en Java?
- 30. ¿Cómo crear un singleton verdadero en java?
posible duplicado de [Patrón de diseño Singleton: Errores] (http://stackoverflow.com/questions/1448393/singleton-design-pattern-pitfalls) – msw