Pregunta Diferencia entre la clase estática y el patrón de singleton?


¿Qué diferencia real (es decir, práctica) existe entre una clase estática y un patrón singleton?

Ambos pueden invocarse sin instanciación, ambos proporcionan solo una "Instancia" y ninguno de ellos es seguro para subprocesos. ¿Hay alguna otra diferencia?


1489
2018-02-06 08:13


origen


Respuestas:


¿Qué te hace decir que un singleton o un método estático no es seguro para subprocesos? Usualmente ambos debería implementarse para que sea seguro para subprocesos.

La gran diferencia entre un singleton y un montón de métodos estáticos es que los singleton pueden implementar interfaces (o derivan de clases base útiles, aunque eso es menos común, según mi experiencia), por lo que puedes pasar el singleton como si fuera "solo otro "implementación.


1042
2018-02-06 08:17



La verdadera respuesta es por Jon Skeet, en otro foro aquí.

Un singleton permite el acceso a un solo   instancia creada - esa instancia (o   más bien, una referencia a esa instancia)   se puede pasar como un parámetro a otro   métodos, y tratados como una   objeto.

Una clase estática solo permite estática   métodos.


403
2018-02-06 08:21



  1. Los objetos Singleton se almacenan en Montón, pero los objetos estáticos se almacenan en apilar.
  2. Podemos clon (si el diseñador no lo desaprobó) el objeto singleton, pero no podemos clonar el objeto de clase estático .
  3. Las clases Singleton siguen el OOP (principios orientados a objetos), las clases estáticas no.
  4. Podemos implementar un interface con una clase Singleton, pero los métodos estáticos de una clase (o, por ejemplo, un C # static class) no poder.

324
2017-09-11 10:22



El patrón Singleton tiene varias ventajas sobre las clases estáticas. Primero, un singleton puede extender clases e implementar interfaces, mientras que una clase estática no puede (puede extender clases, pero no hereda los miembros de su instancia). Un singleton se puede inicializar de forma lenta o asíncrona, mientras que una clase estática generalmente se inicializa cuando se carga por primera vez, lo que genera posibles problemas con el cargador de clases. Sin embargo, la ventaja más importante, sin embargo, es que los singletons se pueden manejar polimórficamente sin forzar a sus usuarios a suponer que solo hay una instancia.


122
2018-02-06 08:30



static las clases no deben hacer nada, necesitan estado, es útil para juntar un montón de funciones, es decir, Math (o Utils en proyectos). Entonces, el nombre de la clase nos da una pista donde podemos encontrar las funciones y no hay nada más.

Singleton es mi patrón favorito y lo uso para administrar algo en un solo punto. Es más flexible que static clases y puede mantener el estado. Puede implementar interfaces, heredar de otras clases y permitir la herencia.

Mi regla para elegir entre static y singleton:

Si hay muchas funciones que se deben mantener juntas, entonces static es la elección. Cualquier otra cosa que necesite acceso único a algunos recursos, podría implementarse singleton.


56
2017-12-30 20:55



Clase estática: -

  1. No puede crear la instancia de clase estática.

  2. Cargado automáticamente por .NET Common Language Runtime (CLR) cuando se carga el programa o espacio de nombres que contiene la clase.

  3. Static Class no puede tener constructor.

  4. No podemos pasar la clase estática al método.

  5. No podemos heredar la clase estática a otra clase estática en C #.

  6. Una clase que tiene todos los métodos estáticos.

  7. Mejor rendimiento (los métodos estáticos están vinculados en tiempo de compilación)

Semifallo:-

  1. Puede crear una instancia del objeto y reutilizarlo.

  2. La instancia de Singleton se crea por primera vez cuando el usuario lo solicitó.

  3. La clase Singleton puede tener constructor.

  4. Puede crear el objeto de la clase singleton y pasarlo al método.

  5. La clase Singleton no dice ninguna restricción de Herencia.

  6. Podemos eliminar los objetos de una clase singleton pero no de clase estática.

  7. Los métodos pueden ser anulados.

  8. Puede cargarse de forma diferida cuando sea necesario (las clases estáticas siempre se cargan).

  9. Podemos implementar la interfaz (la clase estática no puede implementar la interfaz).


49
2018-06-01 11:42



Una clase estática es aquella que tiene solo métodos estáticos, para los cuales una palabra mejor sería "funciones". El estilo de diseño incorporado en una clase estática es puramente de procedimiento.

Singleton, por otro lado, es un patrón específico para el diseño OO. Es una instancia de un objeto (con todas las posibilidades inherentes a eso, como el polimorfismo), con un procedimiento de creación que garantiza que solo haya una instancia de ese rol en particular durante toda su vida.


47
2018-02-06 08:35



En el patrón singleton, puede crear el singleton como una instancia de un tipo derivado, no puede hacer eso con una clase estática.

Ejemplo rápido:

if( useD3D )
    IRenderer::instance = new D3DRenderer
else
    IRenderer::instance = new OpenGLRenderer

32
2018-02-06 08:16



Para ampliar en La respuesta de Jon Skeet

La gran diferencia entre un singleton y un montón de métodos estáticos es que los singletons pueden implementar interfaces (o derivar de clases base útiles, aunque eso es menos común), por lo que puede pasar el singleton como si fuera "solo otra" implementación.

Los Singletons son más fáciles de usar cuando la unidad prueba una clase. Donde quiera que pase singletons como parámetro (constructores, instaladores o métodos), en su lugar puede sustituir una versión simulada o trobada del singleton.


22
2017-12-20 21:53



Otra ventaja de un singleton es que se puede serializar fácilmente, lo cual puede ser necesario si necesita guardar su estado en un disco o enviarlo remotamente.


20
2017-08-08 03:36