2009-08-24 16 views
30

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?

+1

Ésta es una pregunta duplicado . Ver http://stackoverflow.com/questions/46541/when-should-you-use-the-singleton-pattern-instead-of-a-static-class – Patrik

+4

¡No, esa pregunta es exactamente lo opuesto a mi pregunta! Por favor, lea las dos preguntas nuevamente. – Elad

+0

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

Respuesta

39

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.
+3

Esta descripción también funciona para Java. – sal

21

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'); 
6

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.

9

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.

+2

+1 clases estáticas y singletons son accesibles a nivel mundial. Global es malvado :-) –

2

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(); 
Cuestiones relacionadas