1092 votos

¿Qué tiene de malo singleton?

El patrón singleton es un totalmente pagada miembro de la GoF's patrones libro, pero últimamente parece bastante huérfanos por el mundo de desarrollador. Yo todavía uso un buen montón de singleton, especialmente para las clases de fábrica, y mientras que usted tiene que ser un poco cuidadoso acerca de los problemas de subprocesamiento múltiple (como cualquier clase de realidad), no veo por qué son tan horrible.

Stack Overflow en especial parece asumir que todo el mundo está de acuerdo en que los Únicos malos. ¿Por qué?

737voto

Jim Burger Puntos 3166

Parafraseado de Brian Botón:

  1. Generalmente se utilizan como una instancia global, ¿por qué es eso tan malo? Porque ocultar las dependencias de su aplicación en el código, en lugar de exponerlos a través de las interfaces. Hacer algo global para evitar la que pasa a su alrededor es un código de olor.

  2. Se viola el principio de responsabilidad único: en virtud de que el hecho de que el control de su propia creación, y el ciclo de vida.

  3. Ellos inherentemente código de causa a estar bien acoplados. Esto hace que fingir una de ellas bajo prueba bastante difícil en muchos casos.

  4. Llevan estado alrededor durante el tiempo de vida de la aplicación. Otro golpe a la prueba ya que puede acabar con una situación en la que las pruebas deben ser ordenados que es un gran no no para de pruebas de unidad. ¿Por qué? Debido a que cada unidad de prueba debe ser independiente de los otros.

276voto

S.Lott Puntos 207588

Los únicos resolver uno (y sólo uno) de problema.

La Contención De Recursos.

Si usted tiene algunos de los recursos que (1) sólo puede tener una única instancia, y (2) que usted necesita para administrar esa instancia, usted necesita un singleton.

No hay muchos ejemplos. Un archivo de registro es el más grande. Usted no quiere que abandone un único archivo de registro. Desea ras, sincronización y cerrar correctamente. Este es un ejemplo de un solo recurso compartido que ha de ser gestionado.

Es raro que usted necesita un singleton. La razón por la que está mal es que se sienten como un mundial y son totalmente pagada miembro de la GoF Patrones de Diseño de libro.

Cuando usted piensa que usted necesita un mundial, probablemente estás cometiendo un terrible error de diseño.

193voto

Phil Wright Puntos 11696

Algunos de codificación snobs mirar hacia abajo en ellos como un glorificado global. De la misma manera que muchas personas odian el goto declaración hay otros que odian la idea de tener que hacer uso de un mundial. He visto varios desarrolladores de ir a extremos extraordinarios para evitar un mundial porque consideraron que el uso de uno como una admisión de fracaso. Extraño pero cierto.

En la práctica, el Singleton patrón es sólo una técnica de programación que es una parte útil de su caja de herramientas de conceptos. De vez en cuando se puede encontrar es la solución ideal y lo utilizan. Pero utilizando sólo así puede presumir de utilizar un patrón de diseño es tan estúpido como para negarse a utilizar porque es simplemente un mundial.

141voto

jason Puntos 526

Misko Hevery, de Google, tiene algunos artículos interesantes sobre este tema...

Los únicos son Mentirosos Patológicos

Donde tienen todos los embarazos Únicos Ido

59voto

Mike Stone Puntos 21293

Uno más cosa mala acerca de singleton es que no se puede extender a ellos muy fácilmente. Básicamente, tendrá que construir en algún tipo de patrón decorador o algo así que si usted desea cambiar su comportamiento. También, si un día quieres tener varias formas de hacer que una cosa, puede ser bastante doloroso para cambiar, dependiendo de cómo distribuir su código.

Una cosa a tener en cuenta, si usted hace uso de los embarazos únicos, tratar de pasar a quien lo necesita, en lugar de tener acceso directamente... de lo Contrario, si alguna vez decide tener varias formas de hacer lo que singleton hace, va a ser bastante difícil de cambiar como cada clase incluye una dependencia de si se accede a singleton directamente.

Así que, básicamente:

public MyConstructor(Singleton singleton) {
    this.singleton = singleton;
}

en lugar de:

public MyConstructor() {
    this.singleton = Singleton.getInstance();
}

Creo que este tipo de patrón se llama la inyección de dependencia y se considera generalmente una buena cosa.

Como cualquier patrón, aunque... a Pensar y considerar si su uso en una situación dada es inapropiada o no... las Reglas están hechas para ser rotas normalmente, y los patrones no debe ser aplicado queramos o no, sin pensar.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X