El estático vs. La pregunta de Singleton ha sido discutida muchas veces en SO.
Sin embargo, todas las respuestas señalaron las muchas ventajas de un singleton.
Mi pregunta es: ¿cuáles son las ventajas de una clase estática sobre un singleton? ¿Por qué no elegir simplemente un singleton cada vez?¿Por qué elegir una clase estática en lugar de una implementación singleton?
Respuesta
La clase estática es una herramienta técnica en su caja, básicamente una función de idioma.
Singleton es un concepto arquitectónico.
Puede utilizar una clase estática como medio para implementar el concepto de singleton. O puede usar algún otro enfoque.
Con clases estáticas en C# existen potenciales peligros si no tiene cuidado.
- Los recursos solicitados no serán liberados hasta el final de la vida de la aplicación
- Los valores de las variables estáticas son compartidos dentro de una aplicación. Especialmente malo para las aplicaciones ASP.NET, porque estos valores se compartirán entre todos los usuarios de un sitio que resida en un dominio de aplicación particular.
Esta descripción también funciona para Java. – sal
De MSDN
clases estáticas y miembros de la clase se utilizan para crear los datos y funciones que se puede acceder sin crear una instancia de la clase. Los miembros de la clase Static se pueden usar para separar datos y comportamientos que son independientemente de cualquier identidad de objeto: los datos y las funciones no cambian independientemente de lo que le ocurra al objeto . Las clases estáticas pueden ser utilizadas cuando no hay datos o comportamientos en la clase que depende de la identidad del objeto .
Un punto clave es que las clases estáticas do not require an instance reference
. También tenga en cuenta que las clases estáticas están habilitadas específicamente por el lenguaje y el compilador.
Las clases Singleton son solo clases codificadas por el usuario que implementan el patrón de diseño Singleton. El propósito de Singleton es restrict instantiation of an class to a single instance
.
Si codificaras cada clase estática como singleton, tendrías que instanciar la clase cada vez que la usaras.
es decir
Console.WriteLine('Hello World');
se convertiría en
Console c = Console.getInstance();
c.WriteLine('Hello World');
clases estáticas son mucho más fáciles de poner en práctica - He visto muchos intentos de embarazos únicos compatibles con el proceso en C# que emplea combinaciones de bloqueo ingenuos en lugar de depender la inicialización garantizada única de los campos estáticos en tiempo de ejecución (opcionalmente dentro de una clase anidada para retrasar la creación de instancias).
Aparte de eso, creo que los singleton son geniales si necesita pasar una referencia a un objeto que implementa una interfaz específica, cuando esa 'implementación' debe ser singleton, algo que no se puede hacer con clases estáticas.
Yo diría que ambas (generalmente) soluciones pobres. Hay algunos casos de uso para clases estáticas, principalmente simples de utilidad (me vienen a la mente los métodos de extensión en C# 3.0). Sin embargo, con cualquier grado de complejidad, los problemas de comprobación comienzan a aparecer.
Say clase A depende de la clase estática B. Desea probar la clase A de forma aislada. Eso es difícil.
Así que ve con un Singleton. Usted tiene el mismo problema: la clase A depende del singleton B. No puede probar la clase A aisladamente.
Cuando la clase B tiene otras dependencias (como tocar una base de datos) o es mutable (otras clases pueden cambiar su estado global), el problema se agrava.
IoC (Inversion of Control) las bibliotecas de contenedores son una solución a este problema; te permiten definir las Viejas clases simples como una larga vida útil. Cuando se combinan con una biblioteca burlona, pueden hacer que su código sea muy comprobable.
+1 clases estáticas y singletons son accesibles a nivel mundial. Global es malvado :-) –
Una consideración que no veo mencionar es que preferir una solución usando una instancia de una clase (singletons, o su equivalente DI) le permite proporcionar una clase en la que otros usuarios de su código pueden definir métodos de extensión - ya que los métodos de extensión solo funcionan con clases no estáticas como el parámetro this
. En otras palabras, si usted tiene una línea como:
GlobalSettings.SomeMethod();
Entonces sintácticamente la única cosa que se puede acceder a través de GlobalSettings
son miembros suministrados por el usuario. Por el contrario, si GlobalSettings
es una instancia (único o de otro tipo), los consumidores pueden añadir sus propias extensiones a GlobalSettings
que serían incapaces de hacer otra cosa:
application.GlobalSettings.CustomSomethingOrOther();
o
GlobalSettings.Instance.CustomSomethingOrOther();
- 1. ¿Por qué utilizar singleton en lugar de clase estática?
- 2. Uso de singleton en lugar de una instancia global estática
- 3. clase estática y singleton
- 4. clase estática vs clase singleton
- 5. Por qué tienen clase estática pública dentro de una clase
- 6. ¿Elegir un singleton o una categoría?
- 7. ¿Cuándo debería usar el patrón singleton en lugar de una clase estática?
- 8. serializar una clase estática?
- 9. PHP: Singleton vs clase estática
- 10. ¿Por qué la clase Singleton debe sellarse?
- 11. Force Singleton Pattern en una clase que implementa una interfaz
- 12. Patrones DI y Singleton en una implementación
- 13. ¿Una implementación singleton obvia para .NET?
- 14. ¿Por qué utilizar un singleton en lugar de métodos estáticos?
- 15. Establecer @property de una clase Singleton
- 16. Inyectando una dependencia en una clase estática
- 17. ¿Por qué elegir una transformación XSL?
- 18. ¿Por qué sobrecargar el operador de asignación de copia para una clase singleton en C++?
- 19. Singleton - ¿Por qué usar clases?
- 20. ¿Por qué ServerSocket.setSocketFactory estática?
- 21. C# clase estática ¿por qué usar?
- 22. ¿Cuál es la diferencia entre un patrón de Singleton y una clase estática en Java?
- 23. 'Miembro protegido en clase sellada' advertencia (una clase singleton)
- 24. ¿Por qué retener una variable estática?
- 25. ¿Por qué Clojure tiene 5 formas de definir una clase en lugar de solo una?
- 26. Prueba de una clase con una dependencia clase estática/método
- 27. Marcado de una clase estática en VB.NET
- 28. ¿Métodos de extensión en una clase estática?
- 29. La extensión de una clase Singleton
- 30. ¿Por qué una clase implementaría IDisposable explícitamente en lugar de implícitamente?
Ésta es una pregunta duplicado . Ver http://stackoverflow.com/questions/46541/when-should-you-use-the-singleton-pattern-instead-of-a-static-class – Patrik
¡No, esa pregunta es exactamente lo opuesto a mi pregunta! Por favor, lea las dos preguntas nuevamente. – Elad
Esa es una respuesta extraña teniendo en cuenta que la respuesta que usted acepta realmente enfatiza las posibles desventajas de usar clases estáticas. – rism