2010-12-15 19 views
8

¿Hay alguna diferencia entre una clase Singleton y una clase con todos los miembros estáticos (es decir, métodos y atributos).Clases singleton

No pude encontrar ninguna instancia en la que 'toda la clase de miembro estático' no logre la misma funcionalidad que la clase que implementa correctamente el patrón de Singleton?

Por ej. java.lang.Runtime es una clase Singleton adecuada, mientras que java.lang.System tiene todos los métodos estáticos de acceso y simplemente tiene un constructor privado para evitar la construcción externa. ¿Alguien sabe por qué las clases como Runtime se hacen Singleton y no se implementan como java.lang.System.

¿Es simplemente porque sería un diseño más limpio (es decir, imita un objeto de manera más realista) o hay algún beneficio de rendimiento aquí?

+4

¿Cómo es esta 'C'? – Default

+0

Tenga en cuenta que Singleton es un antipatrón: http://www.yegor256.com/2016/06/27/singletons-must-die.html – yegor256

Respuesta

15

Sí, hay una diferencia: un singleton puede implementar una interfaz.

Además, lo que se ve como un conjunto unitario desde el exterior puede ser en realidad implementarse a través de diferentes clases, donde el método de acceso Singleton (por ejemplo Runtime.getRuntime()) puede crear la instancia como en tiempo de ejecución. No digo que eso sea lo que sucedió aquí, pero es una opción.

+3

guau, tiene 3 votos positivos en menos de un minuto. ¿Tienes seguidores o algo? – Default

+0

@Default - ¡esa es una buena idea! Supongo que ayuda a ser Jon Skeet :-) – CoolBeans

+0

@Default Mira su representante. Él ha trabajado duro para ser "el hombre" en esta "comunidad". ;-) – InsertNickHere

3

Bueno, puede serializar y deserializar un objeto (y por lo tanto un Singleton) utilizando la interfaz Serializable (en Java), pero no una clase estática.

0

El propósito principal para singletons citados por GoF es proporcionar un servicio polimórfico, donde el singleton es una clase base abstracta, y el tipo concreto se decide en tiempo de ejecución. Y, por supuesto, solo debe haber uno de ellos en el programa.

1

Un singleton se instancia una vez.

Una clase estática nunca se crea una instancia.

+2

Esto depende del idioma. En Java, por ejemplo, la clase se instancia cuando se carga por el cargador de clases y puede tener bloques de inicialización estáticos. – falstro

0

Creo que no hay diferencia entre lo que usted llama un singleton y una clase con todos los métodos/miembros estáticos en principio. De hecho, creo que crear una clase con todos los miembros estáticos es una forma de implementar el idioma único. Bueno, tal vez en Java hay algún tipo de diferencia seria, pero estoy hablando desde el punto de vista de C++.

0

Creo que deberías preguntarte qué hay de diferente entre la clase final con el constructor privado y la clase estática. Porque singleton es una clase y la implementación depende del programador que programa esta clase. Es lo mismo que preguntar qué diferencias hay entre un objeto y una clase estática.

0

Una clase se puede ampliar para crear otro singleton (por ejemplo, para fines de prueba) o una clase que no sea singleton. los métodos estáticos no se pueden omitir, solo se pueden ocultar en una subclase.

0

Un uso común para singletons con inicialización lenta (también conocido como Meyers singletons) es controlar el orden de inicialización de objetos estáticos (que, en C++, no está definido en diferentes unidades de traducción). En este sentido, los singletons solo se comportan como objetos globales, pero cuyo orden de construcción se comporta bien.

Aunque es bastante difícil controlar el orden de la destrucción. Si debe confiar en que los singletons se destruyan en un orden particular (por ejemplo, una clase de registro de singleton que debe durar más que otras instancias de singleton), consulte el libro de Alexandrescu para ser testigo de la dificultad.