2010-05-04 25 views
68

Nunca he encontrado buenas respuestas a estas simples preguntas sobre clases de ayuda/utilidad:¿Por qué utilizar un singleton en lugar de métodos estáticos?

¿Por qué crearía un singleton (sin estado) en lugar de usar métodos estáticos?

¿Por qué se necesitaría una instancia de objeto si un objeto no tiene estado?

+0

posible duplicado de http://stackoverflow.com/questions/720744/static-class-and-singleton –

+0

No creo que ya que hablamos de 2 idiomas diferentes por lo que la respuesta puede variar, pero gracias por el enlace, en Java nunca escuchó el término "monoestable" –

Respuesta

64

Un singleton se utiliza para introducir algún tipo de estado global en una aplicación. Si es sin estado, también no veo el punto de utilizar un producto único, a menos que

  • tiene previsto ampliarlo con el estado en el futuro previsible o
  • se necesita una instancia de objeto por alguna particular, técnica razón (por ejemplo, para la declaración C# lock, aunque esto ya es bastante descabellado) o
  • necesita herencia, es decir, desea poder reemplazar fácilmente su singleton por otra con la misma interfaz pero una implementación diferente. Por ejemplo, el método Toolkit.getDefaultToolkit() en Java devolverá un singleton cuyo tipo exacto depende del sistema.
+23

Voy a ir con +1, aunque los singletons en mi humilde opinión están ** mal usados ​​** para introducir estados globales. El objetivo de un singleton no es hacer que un objeto esté disponible globalmente, sino hacer cumplir que un objeto se instancia solo una vez. Los objetos globales son un mal necesario. A menos que realmente se requiera, uno debe tratar de no usarlos, ya que generalmente conducen a un alto acoplamiento, con SomeSingleton.getInstance(). SomeMethod() por todas partes.:) – back2dos

+0

Puede ser útil en juegos en los que solo desea una instancia de renderizado en lugar de varias instancias de renderizado, o con una clase de canalización de red en la que configura un canal seguro que solo puede tener una conexión a la vez. – Tschallacka

+2

"reemplazar fácilmente su singleton" es el punto más importante en mi punto de vista. El resto está muy cerca de la implementación de clase estática. –

34

Pude ver un caso para un singleton sin estado que se utiliza en lugar de una clase de métodos estáticos, es decir, para Dependency Injection.

Si tiene una clase auxiliar de funciones de utilidad que está utilizando directamente, crea una dependencia oculta; no tienes control sobre quién puede usarlo o dónde. Inyectar esa misma clase de ayuda a través de una instancia de singleton sin estado le permite controlar dónde y cómo se usa, y reemplazarlo/simularlo/etc. cuando lo necesite.

Convertirlo en una instancia singleton simplemente asegura que no está asignando más objetos del tipo que el necesario (ya que solo necesita uno).

+1

* "no tienes control sobre quién puede usarlo o dónde". * ¿Por qué alguien lo necesitaría? – hagrawal

+0

@hagrawal para fines de prueba, debería poder simularlo –

5

En la mayoría de los lenguajes de programación las clases eluden mucho al tipo de sistema. Mientras que una clase, con sus métodos y variables estáticos es un objeto, muy a menudo no puede implementar una interfaz o extender otras clases. Por esa razón, no se puede usar de forma polimórfica, ya que no puede ser el subtipo de otro tipo. Por ejemplo, si tiene una interfaz IFooable, que es requerido por varias firmas de los métodos de otras clases, la clase de objeto StaticFoo no se puede utilizar en lugar de IFooable, mientras que FooSingleton.getInstance() puede (asumiendo, FooSingleton implementos IFooable).

Tenga en cuenta que, como he comentado en la respuesta de Heinzi, un singleton es un patrón para controlar la creación de instancias. Reemplaza new Class() con Class.getInstance(), lo que le da al autor de Class más control sobre las instancias, que puede usar para evitar la creación de instancias innecesarias. El singleton es solo un caso muy especial del patrón de fábrica y debe tratarse como tal. El uso común hace que sea más bien el caso especial de los registros globales, que a menudo termina mal, porque los registros globales no se deben usar simplemente quiera o no.

Si planea proporcionar funciones de ayuda global, los métodos estáticos funcionarán bien. La clase no actuará como clase, sino solo como un espacio de nombres. Sugiero que mantenga una alta cohesión o que termine con los problemas de acoplamiento más extraños.

greetz
back2dos

0

Singleton no es sin estado, se mantiene el estado global.

Algunas razones que se me ocurre usando Singleton son:

  • Para evitar pérdidas de memoria
  • para proporcionar el mismo estado de todos los módulos en una conexión de base de aplicación, por ejemplo
+0

Lo sé, pero en realidad un singleton puede ser más o menos sin estado ... Si no comparte ningún atributo de clase ... –

11

realidad yo He encontrado otra respuesta no mencionada aquí: los métodos estáticos son más difíciles de probar.

Parece que la mayoría de los frameworks de prueba funcionan bien para burlarse de los métodos de instancia, pero muchos de ellos no manejan de una manera decente la simulación de métodos estáticos.

+2

Pero Powermock parece ser capaz de hazlo –

2

Hay una disyuntiva entre usar cualquiera. Los singletons pueden o no tener estado y se refieren a objetos. Si no mantienen el estado y solo se utilizan para el acceso global, entonces la estática es mejor ya que estos métodos serán más rápidos. Pero si desea utilizar objetos y conceptos de OOP (polimorfismo de herencia), entonces singleton es mejor.

Considere un ejemplo: java.lang.Runtime es una clase singleton en java. Esta clase permite diferentes implementaciones para cada JVM. La implementación es única por JVM. Si esta clase hubiera sido estática, no podemos aprobar implementaciones diferentes basadas en JVM.

Encontré realmente útil este enlace: http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html?

Espero que ayude !!

+0

Esta respuesta es buena para incluir un ejemplo concreto en el mundo real. – systemovich

1

Para mí "¿Quieres objeto de estado de uso Singleton, ¿Quieres Función utilice método estático"

Depende de lo que quiera. Siempre que desee el estado del objeto (por ejemplo, Polimorfismo como estado nulo en lugar de null, o estado predeterminado), singleton es la elección adecuada para usted, mientras que el método estático se usa cuando necesita la función (Recibir entradas y luego devolver una salida).

Lo recomiendo para el caso singleton, siempre debe ser el mismo estado después de que se crea una instancia. No debe ser clonable, ni recibir ningún valor para establecer en (excepto la configuración estática del archivo, por ejemplo, propiedades archivo en java).

P.S. El rendimiento entre estos 2 es diferente en milisegundos, por lo que primero debe centrarse en Arquitectura.

Cuestiones relacionadas