Un amigo mío me preguntó hoy por qué debería preferir el uso de singleton sobre el objeto estático global? La forma en que lo comencé a explicar fue que el singleton puede tener estado vs. objeto estático global no ... pero no estaba seguro ... porque esto en C++ ... (venía de C#)
Un objeto global estática puede tener estado en C#, así:
class myclass {
// can have state
// ...
public static myclass m = new myclass(); // globally accessible static instance, which can have state
}
¿Cuáles son las ventajas uno sobre el otro? (en C++)
Un singleton paraliza su código, una instancia global no estática. Hay innumerables preguntas sobre SO sobre los problemas con los singletons. Here's one, and another, or another.
En resumen, un producto único le da dos cosas:
- un objeto accesible a nivel mundial, y
- una garantía de que sólo una instancia puede ser creado.
Si queremos solo el primer punto, debemos crear un objeto accesible a nivel mundial. Y ¿por qué querríamos el segundo? Nosotros no conocemos de antemano cómo nuestro código puede ser utilizado en el futuro, entonces, ¿por qué eliminarlo y eliminar lo que puede ser una funcionalidad útil? Usualmente somos mal cuando predecimos que "solo necesitaré una instancia". Y hay una gran diferencia entre "Solo necesitaré una instancia" (la respuesta correcta es create una instancia), y "la aplicación no se puede ejecutar bajo ninguna circunstancia si se crea más de una instancia. bloqueo, formatee el disco duro del usuario y publique datos confidenciales en Internet "(la respuesta aquí es: lo más probable es que su aplicación esté rota, pero si no es así, entonces sí, es lo único que necesita)
y luego introduce condiciones de carrera complejas y descarta la seguridad del hilo porque dos hilos pueden llamar a esa función simultáneamente. – jalf
Curiosamente, std :: cout parece funcionar bien, a pesar de ser un simple objeto global antiguo ... Estoy seguro de que si el orden de inicialización fuera un problema tan grande, el comité estándar ya lo habría notado.Solo es un problema si usa en exceso los globales y hace que dependan unos de otros. – jalf
@jalf: Haz tu tarea. 'cout' y' cin' se especifican específicamente para ser construidos antes de 'main()' por el estándar. Otros objetos globales no reciben este tratamiento. Además, existen implementaciones de singleton seguras para hilos y no es difícil escribir usted mismo; solo necesita un doble candado para evitar la doble construcción. Personalmente trato de evitar singletons, creo que el patrón se usa en exceso. Pero tu falta de conocimiento de C++ no es motivo para menospreciarme. – rlbond