language-agnostic singleton theory

language agnostic - Propósito de los singletons en la programación



language-agnostic theory (9)

por qué querrías

No lo haría porque los singleton usualmente son una muy mala manera de resolver sus problemas. Mi recomendación para usted es evitarlos por completo.

Las principales razones son:

  • Los singletons en su mayoría representan el estado global (que es el mal).
  • La correcta inyección de dependencia se vuelve imposible.

Le sugiero que lea el resto (incluidas explicaciones exhaustivas) en el blog de este empleado de Google:

Esta es, sin duda, una pregunta bastante flexible. Mi comprensión actual de singletons es que son una clase que configuras de tal forma que solo se crea una instancia.

Esto se parece mucho a una clase estática para mí. La principal diferencia es que con una clase estática no puedes / no puedes instanciarla, solo la utilizas como Math.pi() . Con una clase Singleton, aún necesitarías hacer algo como

singleton firstSingleton = new singleton(); firstSingleton.set_name("foo"); singleton secondSingleton = new singleton();

firstSingleton == secondSingleton si estoy equivocado, pero firstSingleton == secondSingleton este momento, ¿sí?

secondSingleston.set_name("bar"); firstSingleton.report_name(); // will output "bar" won''t it?

Tenga en cuenta que estoy preguntando este idioma de forma independiente, más sobre el concepto. Así que no estoy preocupado acerca de cómo codificar una clase así, sino más bien por qué querrías hacerlo y qué cosas tendrías que considerar.


  1. Singleton es un reemplazo muy útil de variables globales, utilizado en todo el código.
  2. Los singletons generalmente no son "nuevos" ed o "eliminados" d, tienden a inicializarse en el primer uso y se eliminan junto con el alcance del programa
  3. Los Singletons combinan perfectamente para envolver el registro, la configuración y otras clases de interfaces de hardware.

Además de las otras respuestas, diría que Singletons puede ayudarte cuando quieres una clase estática, pero no puede tenerla porque, debido al diseño de tu aplicación, heredará una clase instanciable.


Como otros han dicho:

  • Los singletons son variables globales con otro nombre.
  • Los singletons generalmente son una mala idea.
  • Los singletons podrían reemplazarse por clases "monostate", clases que tienen una semántica de construcción / destrucción aparentemente normal, pero todas comparten el mismo estado.

Tenga en cuenta que, en mi opinión, las "clases estáticas" suelen ser también una mala idea, una solución provisional para un lenguaje que no permite funciones gratuitas, o para compartir estado entre un conjunto de funciones sin querer pasar ese estado como parámetro.

En mi experiencia, casi todos los diseños con singletons o clases estáticas se pueden convertir en algo mejor, más fácil de comprender y más flexible al deshacerse de esos constructos.

Editar: a pedido, ¿por qué la mayoría de los singletons son variables globales con otro nombre?

En la mayoría de los idiomas que conozco, se accede a la mayoría de las clases únicas a través de una función de miembro estática de esa clase. La instancia única está disponible para todos los códigos que tienen acceso a la definición de la clase singleton. Esta es una variable global: todo el código que incluye la clase podría hacer modificaciones a la única instancia de su singleton.
Si no usa la función de miembro estático (o algún método de fábrica estático que tenga las mismas implicaciones), sino que pase el objeto singleton a todos los clientes que lo necesiten, entonces no tendría necesidad del patrón singleton, simplemente pase el mismo objetar a todos los clientes.


Hay dos formas de usar singletons.

  1. La forma en que deberían ser utilizados. Típicamente con variables inmutables (C # ''s String.Empty, clases en Smalltalk, etc.). Esto es aproximadamente el 1% del uso de singleton.
  2. Como reemplazo de variables globales. Esto es malo. La causa principal de esto es la gente que quiere compartir objetos comunes sin entender cómo usar correctamente un generador. El uso de Singletons de esta manera es típicamente un signo de falta de comprensión profunda del diseño orientado a objetos.

La ventaja principal de un singleton sobre una clase que consiste en estática es que luego puede decidir fácilmente que realmente necesita más de una instancia, por ejemplo, una por hilo.

Sin embargo, en la práctica, el objetivo principal de los singleton es hacer que las personas se sientan menos mal por tener variables globales.

Un ejemplo práctico para un buen uso de un singleton: tiene una aplicación que utiliza una base de datos SQL y necesita un grupo de conexiones. El objetivo de dicho grupo es reutilizar la conexión de base de datos, por lo que definitivamente desea que todos los clientes utilicen el mismo grupo. Por lo tanto, tenerlo como singleton es el diseño correcto. Pero un día necesita la aplicación para conectarse a un segundo servidor de bases de datos y darse cuenta de que no puede tener conexiones con diferentes servidores en el mismo grupo. Por lo tanto, su singleton "instancia única general" se convierte en "una instancia por servidor de base de datos".


Los singletons son más útiles cuando se quiere una interfaz para un servicio singleton, pero no se sabe hasta el tiempo de ejecución qué clase concreta será instanciada.

Por ejemplo, es posible que desee declarar un servicio de registro central, pero solo decidir en tiempo de ejecución si desea conectar un registrador de archivos, un registrador de stub, un registrador de base de datos o un registrador de cola de mensajes.


No todos los idiomas tienen "clases estáticas" (por ejemplo, C ++ no los tiene).

De nuevo con el ejemplo de C ++, agregar variables estáticas a una clase es un problema porque necesita ponerlas tanto en el encabezado como en el archivo .cpp, por lo que un singleton en ese caso es muy útil.

Cada idioma es diferente Supongo que en C # no son muy útiles (y de hecho, por lo que sé, no se usan con mucha frecuencia)


Un poco de conocimiento es algo peligroso y los Singleton son entidades peligrosas. Además de las cosas escritas arriba, puedo enfatizar que la administración de por vida de los objetos de Singleton también es importante. En el marco de ACE, se maneja con éxito. Puede encontrar el documento aquí: http://www.cs.wustl.edu/~schmidt/PDF/ObjMan.pdf

Tenga en cuenta que los singletons deben ser clases no copiables. Este patrón puede parecer el más fácil, pero, por el contrario, es uno de los más difíciles. Por lo tanto, les pregunto a los candidatos sobre estos puntos malvados en Singletons.