¿Cuáles son los inconvenientes o desventajas del patrón singleton? [cerrado]

Resuelto m87 asked hace 16 años • 36 respuestas

El patrón singleton es un miembro totalmente pagado del libro de patrones del GoF , pero últimamente parece bastante huérfano por el mundo de los desarrolladores. Todavía uso bastantes singletons, especialmente para clases de fábrica , y aunque hay que tener un poco de cuidado con los problemas de subprocesos múltiples (como cualquier clase en realidad), no veo por qué son tan horribles.

Stack Overflow parece asumir especialmente que todos están de acuerdo en que los Singleton son malvados. ¿Por qué?

Respalde sus respuestas con " hechos, referencias o experiencia específica "

m87 avatar Sep 26 '08 13:09 m87
Aceptado

Parafraseado de Brian Button:

  1. Generalmente se utilizan como instancia global, ¿por qué es tan malo? Porque ocultas las dependencias de tu aplicación en tu código, en lugar de exponerlas a través de las interfaces. Hacer algo global para evitar su difusión es un olor a código .

  2. Violan el principio de responsabilidad única : en virtud del hecho de que controlan su propia creación y ciclo de vida.

  3. Intrínsecamente hacen que el código esté estrechamente acoplado . Esto hace que en muchos casos sea bastante difícil falsificarlos durante la prueba.

  4. Mantienen el estado durante toda la vida útil de la aplicación. Otro golpe a las pruebas, ya que puede terminar en una situación en la que es necesario solicitar pruebas, lo cual es un gran no, no para las pruebas unitarias. ¿Por qué? Porque cada prueba unitaria debe ser independiente de la otra.

Jim Burger avatar Sep 26 '2008 06:09 Jim Burger

Los singleton resuelven un (y sólo uno) problema.

Contención de recursos.

Si tienes algún recurso que

( 1 ) solo puede tener una única instancia, y

( 2 ) necesita administrar esa única instancia,

necesitas un singleton .

No hay muchos ejemplos. Un archivo de registro es el más importante. No querrás abandonar un único archivo de registro. Quiere vaciarlo, sincronizarlo y cerrarlo correctamente. Este es un ejemplo de un único recurso compartido que debe gestionarse.

Es raro que necesites un singleton. La razón por la que son malos es que se sienten globalizados y son miembros totalmente pagados del libro GoF Design Patterns .

Cuando cree que necesita un sistema global, probablemente esté cometiendo un terrible error de diseño.

S.Lott avatar Sep 26 '2008 23:09 S.Lott

Algunos snobs de la codificación los consideran simplemente un global glorificado. De la misma manera que muchas personas odian la declaración goto , hay otras que odian la idea de utilizar alguna vez un global . He visto a varios desarrolladores hacer todo lo posible para evitar un global porque consideraron usarlo como una admisión de fracaso. Extraño pero cierto.

En la práctica, el patrón Singleton es solo una técnica de programación que es una parte útil de su conjunto de herramientas de conceptos. De vez en cuando puede que descubras que es la solución ideal y la utilices. Pero usarlo solo para poder presumir de usar un patrón de diseño es tan estúpido como negarse a usarlo porque es solo un patrón global .

Phil Wright avatar Sep 26 '2008 06:09 Phil Wright