2009-04-07 13 views
28

He intentado algunas veces entender qué es Singleton. Tal vez soy demasiado visual ... así que ¿alguien puede analizarlo en una simple analogía?Sí ... Lo sé .. Soy un simplón ... ¿Qué es un Singleton?

Mensajes similares:

+4

Antes de comenzar a utilizar Singleton en cualquier lugar, lea también esta publicación: http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons :-) –

+0

En C++, si declara un variable como "estática", está creando efectivamente un singleton. – slashmais

Respuesta

67

Conforme a lo solicitado, aquí hay algunas analogías:.

  • La Tierra
  • El Universo
  • El elemento oxígeno (hay otros elementos, pero sólo uno de oxígeno Hay un montón de moléculas de oxígeno, pero sólo uno de los elementos oxígeno canónica.)
  • El concepto de True
  • El concepto de falso

Puede crear una instancia de muchos objetos True, pero todos se referirán al mismo elemento real (es decir, el concepto universal de Verdadero).Dependiendo de dominio de su aplicación, puede haber ejemplos más específicos:

  • La conexión a la base
  • hilo principal de la aplicación
  • Cualquier cosa que representa un dispositivo de hardware (es decir, sólo se desea crear una instancia de un objeto que representa CPU0) .
+2

No estoy seguro de que la comparación con el oxígeno sea apropiada; hay muchas moléculas con la misma configuración que las demás, que categorizamos como oxígeno, y todas ellas son moléculas distintas que pueden manipularse independientemente unas de otras. – Rob

+14

Químico. Los estudiantes de artes liberales se quejarán sobre mi uso de Verdadero y Falso como universales. Los de ciencia ficción se quejarán de que me perdí el multiverso. El OP entendió mi significado. :-) – runako

+0

No estoy seguro de la conexión de la base de datos, viola el "¿Alguna vez alguna aplicación necesitará una sola instancia de esta clase?" de mi publicación. Es posible que desee ejecutar más de una solicitud a la vez, en múltiples conexiones. – Martin

18

Un singleton es una clase de la cual solo puede haber una instancia en su aplicación. A continuación, comparte esa instancia en toda la aplicación.

Aquí hay un enlace que podría ayudar a (cubre cómo hacer que su hilo Singleton seguro en C# también):

Implementing the Singleton Pattern in C#

+0

¿Es similar a una clase de solo lectura? – madcolor

+0

No. Es una clase de instancia única, es decir, persiste en un solo lugar de la memoria, sin importar quién lo llame. –

+0

Ahh .. en .Net ¿sería context.items similar? – madcolor

0

Además de su lugar como un patrón de diseño particular, los singleton también se pueden considerar simplemente una cosa. Su uso en la programación sin duda se deriva de su uso en las matemáticas, donde un singleton es un conjunto de un solo número.

+0

¿O quizás de su uso en el inglés cotidiano? –

+0

@Neil: Solo un programador diría algo así ... –

13

Singleton es útil cuando se debe estar seguro de que existe una y único instancia de una clase, y que este objeto se debe acceder desde múltiples ubicaciones en el código.

Si podría tener sentido que más de una instancia de su clase se pudiera utilizar a la vez, entonces no desea un singleton.

Aquí hay alguna información sobre dónde utilizar únicos: http://www.ibm.com/developerworks/webservices/library/co-single.html

Desde el artículo mencionado anteriormente:

para decidir si una clase es realmente un producto único , debe hacerse algunas preguntas .

  • ¿Todas las aplicaciones utilizan esta clase exactamente de la misma manera? (exactamente es la palabra clave)
  • ¿Alguna vez alguna aplicación necesitará una sola instancia de esta clase?
    (nunca y uno son las palabras clave)
  • caso de que los clientes de esta clase no ser conscientes de la aplicación son
    parte de?

    Si responde afirmativamente a las tres preguntas, entonces ha encontrado un singleton. Los puntos clave aquí son que una clase es solo un singleton si todas las aplicaciones lo tratan exactamente igual y si sus clientes pueden usar la clase sin un contexto de aplicación.

+0

+1 para explicar el * motivo * –

+0

Otro aspecto importante es que puedes arrancar el singleton 'fuera del aire' desde cualquier parte del código y obtener el mismo objeto. Por lo tanto, es fácil invocar un puntero/referencia al mismo objeto singleton global desde cualquier función, debido a esto, a menudo se usa para configuraciones globales. Solo pensar en la singularidad es un poco limitante, el nombre singleton es un poco engañoso. –

1

un singleton es una clase, que sólo puede tener una sola instancia creada.

Esto a menudo se implementa teniendo un constructor privado, que se asigna a una variable estática, y luego se accede a través de un método público.

Hay algunos problemas con el uso únicos, incluyendo:

  • Ellos hacen pruebas difíciles
  • No pueden ser sub-clasifican
  • Una vez creada, la instancia vivirá para siempre

Vea aquí para una descripción más detallada de singleton, y otro patrón 'Monostate' que podría ser útil en su lugar: http://www.objectmentor.com/resources/articles/SingletonAndMonostate.pdf

0

Singleton puede ser a veces no es tan sencillo. Eche un vistazo aquí: When a singleton is not a Singleton?, artículo proporcionado por Sun.

Una recomendación: No lo use. Simplemente no es bueno, puede crear serios cuellos de botella de rendimiento en su aplicación, y el esfuerzo por probar las clases singleton simplemente no lo vale.

del artículo de Wikipedia mencionado anteriormente:

Hay que señalar que este patrón hace que la unidad de pruebas mucho más difícil, ya que introduce Estado global en una aplicación.

Otro recurso que vale la pena mirar es this post en el blog de google testing.

0

Había una excelente Google Tech Talk donde el orador se dirigió estado global (incluyendo Singleton) y por qué se hacen las pruebas casi imposible:

The Clean Code Talks - "Global State and Singletons"

El orador hace una distinción entre lo que que llama Singleton (mayúscula 'S'), donde se toman medidas para evitar que la clase sea instanciada más de una vez (es decir, a menudo con un método getInstance estático y constructores privados), y singletons ('s' pequeños) donde una sola instancia es todo eso siempre se necesita, pero nada está integrado en la clase para evitar múltiples instancias de b eing creado.

Cuestiones relacionadas