¿Diferencia entre clase estática y patrón singleton?

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

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

preguntado el 06 de febrero de 09 a las 06:02

Dependiendo de la implementación del lenguaje y sus patrones de uso, un Singleton puede ser menos eficiente debido a la sobrecarga de llamar al getInstance() método cada vez que desee utilizarlo (aunque probablemente en la mayoría de los casos No importa). -

Ya hay muchas respuestas. En realidad es un singleton objeto donde static Los métodos son solo funciones, una entidad no orientada a objetos. -

Depende de la implementación. csharpin depth.com/Articles/General/Singleton.aspx -

Existe una diferencia cuando desea permitir que terceros proporcionen la implementación de la clase. En este caso, normalmente también necesitará patrones de fábrica. Ver agiletribe.wordpress.com/2013/10/08/… -

En mi opinión, esta respuesta lo resume muy bien. stackoverflow.com/questions/14097656/… -

30 Respuestas

¿Qué te hace decir que un método singleton o estático no es seguro para subprocesos? Por lo general, ambos tienes implementarse para ser 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 derivar de clases base útiles, aunque eso es menos común, en mi experiencia), por lo que puede pasar el singleton como si fuera "solo otro "implementación.

contestado el 24 de mayo de 17 a las 12:05

Bueno, si lo prefiere, ninguno de los dos es inherentemente seguro para subprocesos, debe hacer que ambos sean seguros para subprocesos, por lo que no hay diferencia. - jorge cordoba

¿Puede dar un ejemplo de algo que is intrínsecamente seguro para subprocesos, distintos de los tipos inmutables? - jon skeet

Para Skeet: las personas que dicen que singleton no es seguro para subprocesos significa que un singleton se comparte entre subprocesos innecesariamente todo el tiempo, mientras que los objetos de la pila se comparten cuando los necesita, lo que significa que no tiene que realizar una sincronización innecesaria. - Iraimbilanja

@Geek: imagina que el singleton implementa una interfaz Foo, y tienes un método que toma un Foo como parámetro. Con esa configuración, las personas que llaman pueden optar por usar el singleton como implementación, o pueden usar una implementación diferente. El método está desacoplado del singleton. Compare eso con la situación en la que la clase solo tiene métodos estáticos: cada pieza de código que quiere llamar a esos métodos está estrechamente acoplada a la clase, porque necesita especificar qué clase contiene los métodos estáticos. - jon skeet

@AmirBareket: Sin embargo, no es un singleton según el patrón de diseño singleton; si la clase en sí permite que se creen múltiples instancias, no es un singleton IMO, independientemente de lo que haga la fábrica. - jon skeet

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

Un singleton permite el acceso a una sola instancia creada; esa instancia (o más bien, una referencia a esa instancia) se puede pasar como un parámetro a otros métodos y tratarse como un objeto normal.

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

Respondido el 19 de enero de 11 a las 15:01

Sin embargo, ¿por qué pasaría un Singleton como parámetro si puede acceder a la misma instancia desde casi cualquier lugar llamando al método estático getInstance ()? - Henrique Ordina

@HenriqueOrdine ¿Entonces puede caber en el código existente y proporcionar una interfaz? - usuario1115652

@HenriqueOrdine Están hablando de una clase estática, no de una clase con métodos estáticos. No se puede crear una instancia de la clase estática. Sin embargo, si pasa una instancia de una clase (no estática) que contiene métodos estáticos, no puede llamar a métodos estáticos en una instancia. - Goran

¿Qué es una clase estática? Al menos en Java, no existe tal cosa. - Henrique Ordina

@Goran Inicialmente estaba muy confundido por tu redacción. Dijiste "no puedes llamar a métodos estáticos en una instancia". Lo leí como "si tiene una referencia a un objeto instanciado, no puede llamar a ningún método estático que pueda tener". Eso es, por supuesto, incorrecto. Después de leerlo de nuevo unas cuantas veces, creo que quiso decir "desde dentro de métodos estáticos no puede acceder a objetos no estáticos en la clase", lo cual es correcto. Quiere aclarar eso para cualquier persona nueva en estos conceptos que se encuentre con esta respuesta y lea sus comentarios. - Andrés Steitz

  1. Los objetos singleton se almacenan en Montón, pero los objetos estáticos se almacenan en montón.
  2. Podemos clonar (si el diseñador no lo rechazó) el objeto singleton, pero no podemos clonar el objeto de clase estática.
  3. Las clases singleton siguen el programación orientada a objetos (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 puedo.

respondido 15 mar '17, 15:03

La segunda afirmación es incorrecta. No podemos clonar el objeto Singleton. La implementación de Singleton debe rechazar esto. Si realmente puedes clonar Singleton, no es Singleton. - Alejandro Yancharuk

Esta respuesta no es correcta para Java: ni el singleton ni el static usan la pila. - ÁgilPro

# 1 no es importante. # 2 describe una implementación defectuosa. # 3 es completamente injustificable. - Casey

¿Cómo se puede almacenar un objeto estático en una pila? Se crea un nuevo marco de pila cuando invoca un método, almacena las variables locales del método, este marco de pila se elimina cuando el método regresa y esas variables locales se pierden. Sure stack es rápido, pero no es adecuado para almacenar objetos estáticos. - mike_m

No puedo entender la cantidad de votos a favor de este. 1) ¿Por qué debería almacenarse Singleton en una pila? En lenguajes administrados como C # o Java, los datos se almacenan en un montón administrado, excepto para las variables / parámetros del método local. 2) Si puede clonarlo, entonces no es un singleton implementado correctamente. 3) Singleton se conoce como un anti-patrón OOP; es decir, algo que debe evitar si es posible. 4) Esto es lo único correcto. - Groo

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 sus miembros de instancia). Un singleton se puede inicializar de forma perezosa o asincrónica, 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 es que los singleton se pueden manejar de forma polimórfica sin obligar a sus usuarios a asumir que solo hay una instancia.

Respondido 06 Feb 09, 08:02

+1 para puntos buenos y pragmáticos. El patrón singleton se usa en exceso en general, pero hay algunas situaciones en las que es adecuado. Ver también: agiletribe.wordpress.com/2013/10/08/… - ÁgilPro

Tiene razón sobre la ventaja de ser polimórfico. Este es el punto mas importante - Ahmad

La clase estática anidada puede implementar la interfaz. Intente codificarlo, funcionará. Podría compilar el código sin ningún error. - nanosoft

static Las clases no son para nada que necesite estado. Es útil para juntar un montón de funciones, es decir Math (o Utils en proyectos). Entonces, el nombre de la clase solo nos da una pista de dónde podemos encontrar las funciones y nada más.

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

Mi regla para elegir entre static y singleton:

Si hay un montón de funciones que deben mantenerse juntas, entonces static es la elección. Cualquier otra cosa que necesite acceso único a algunos recursos, podría implementarse como un singleton.

respondido 26 mar '19, 05:03

¿Por qué las clases estáticas no deberían hacer nada que necesite salvar el estado? - trisped

@Trisped: no tiene un control preciso sobre la inicialización ni la finalización. - Xaqrón

me perdiste en "Singleton es mi patrón favorito". Singleton es una esquina tan afilada que debería considerarse un anti-patrón además de un patrón. Las clases pueden tener estados estáticos, que también es de acceso único, si algo, el estado estático es más "acceso único" que singleton porque la mayoría de las implementaciones de singleton están rotas, es decir. puede clonar el singleton, mientras que estático está bendecido por la definición para ser único. - Desarrollado por Arroz

¿Qué significa mantener el estado? ¿Qué es el estado? - kyle delaney

@KyleDelaney: Simplemente State es la combinación de diferentes propiedades de un objeto que generalmente cambian con el tiempo. Puede buscar en Google una definición formal. - Xaqrón

Clase estática: -

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

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

  3. La clase estática 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 se enlazan en tiempo de compilación)

Único:-

  1. Puede crear una instancia del objeto y reutilizarlo.

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

  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 deshacernos de los objetos de una clase singleton pero no de una clase estática.

  7. Los métodos se pueden anular.

  8. Se puede cargar 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).

Respondido el 01 de junio de 15 a las 12:06

Las clases estáticas tienen constructores: msdn.microsoft.com/en-us/library/k9x6w0hc.aspx - tomer arazy

Sí, static puede tener un constructor interno a esa clase. Esto se invoca cuando se llama a cualquier método estático de la clase. - Raulmr

Para singleton en tiempo de compilación, se almacena en la memoria HEAP, pero si se crea una instancia una vez, ¿se almacena en STACK? - Luminoso_Dev

@Luminous_Dev No. Cualquier instancia de singleton es una instancia de objeto al final del día. Se almacenará en el montón sin duda. - RBT

@rahulmr Distinción importante: el constructor también se invoca antes de que se cree la primera instancia (también conocida como AKA). - GenialOppo

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

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 asegura que solo haya una instancia de ese rol particular durante toda su vida.

Respondido 06 Feb 09, 08:02

el polimorfismo no entra en juego con los singleton en absoluto - Iraimbilanja

Eso crees. Yo pienso diferente. ;) Por ejemplo, imagina una fábrica de singleton que devuelve una interfaz. Sabes que estás obteniendo un ISingleton (y es el mismo para siempre) pero no necesariamente qué implementación. - morenil

La clase estática anidada también puede tener métodos de instancia, no está restringida a tener solo métodos estáticos. Codifíquela y podrá ver. - nanosoft

En lenguajes con un modelo de objetos más agradable (por ejemplo, Ruby), las clases también son objetos. El aspecto "puramente procedimental" de una clase estática es una restricción arbitraria impuesta por el lenguaje. - Max

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

Ejemplo rápido:

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

Respondido 06 Feb 09, 08:02

En realidad, no es un patrón singleton, me parece más una fábrica. - vava

En realidad, no, la diferencia fundamental entre los dos es que el Singleton "almacenará en caché" su único objeto y seguirá devolviendo (una referencia a) el mismo. El patrón de fábrica creará nuevas instancias. - Místico

Entonces es proxy-singleton :) - vava

Hmm, conozco esta variedad de Singleton como MonoState. - jovial

ejemplo es el patrón de fábrica - Rajavel D.

Para expandir Respuesta de Jon Skeet

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

Es más fácil trabajar con singletons cuando se realiza una prueba unitaria de una clase. Dondequiera que pase singletons como parámetro (constructores, setters o métodos), puede sustituirlo por una versión simulada o stubned del singleton.

contestado el 23 de mayo de 17 a las 13:05

No creo que puedas burlarte directamente de un singleton. ¿No tendrías que declarar una interfaz que implementen el singleton y la clase simulada? - Ellen Spertus

@espertus ¿Por qué no puedes burlarte de tu singleton? Ejemplo usando mockito MySingleton mockOfMySingleton = mock(MySingleton.class). - mike rylander

tienes razón, puedes burlarte de él con herramientas como mockito que usan la reflexión. Quise decir que no puede burlarse de él directamente subclasificando y anulando sus métodos. - Ellen Spertus

@espertus ¿Por qué no? Cuando crea una instancia del objeto que está probando, puede sustituir la implementación de subclase de su singleton dondequiera que hubiera usado el original. Ex: new ClazzToTest(mockSingleton); - mike rylander

No he usado Mockito, pero ¿cómo se puede subclasificar una clase que tiene un constructor privado, que es el caso de los singleton, excepto usando la reflexión? Discusiones relacionadas: stackoverflow.com/questions/2302179/mocking-a-singleton-class stackoverflow.com/questions/15939023/… - Ellen Spertus

Aquí tienes un buen artículo: http://javarevisited.blogspot.com.au/2013/03/difference-between-singleton-pattern-vs-static-class-java.html

Clases estáticas

  • una clase que tiene todo métodos estáticos.
  • mejor rendimiento (los métodos estáticos se enlazan en tiempo de compilación)
  • no puede anular métodos, pero puede utilizar la ocultación de métodos. (¿Qué método se esconde en Java? Incluso la explicación de JavaDoc es confusa)

    public class Animal {
        public static void foo() {
            System.out.println("Animal");
        }
    }
    
    public class Cat extends Animal {
        public static void foo() {  // hides Animal.foo()
            System.out.println("Cat");
        }
    }
    

Semifallo

En resumen, solo usaría clases estáticas para mantener métodos util y usar Singleton para todo lo demás.


Edits

Respondido el 12 de Septiembre de 17 a las 05:09

No sé acerca de Java, pero en .Net, sus dos últimos puntos son incorrectos. Las clases estáticas pueden hacer referencia a propiedades y campos estáticos, por lo que en el estado son iguales. Y tienen carga diferida: el constructor estático se ejecuta cuando: 1) Se crea una instancia de la clase. 2) Se hace referencia a cualquiera de los miembros estáticos de la clase. 1 no se aplica, lo que deja 2. Por lo tanto, una clase estática no se carga hasta la primera vez que se usa. - jmoreno

Para la clase estática, aunque no puede anular el método estático, puede ocultar el método estático de su padre. - Peng Max

if Animal animal = new Cat(); luego animal.foo(); ¿lo que sucede? - Luminoso_Dev

¿La clase estática @jmoreno no se carga hasta que se usa por primera vez? Creo que se almacena en la memoria de la pila en tiempo de compilación. Y se accede instantáneamente ... ¿no? - Luminoso_Dev

@Luminous_Dev: al menos para .net, una clase estática tiene un constructor que se ejecuta cuando se accede por primera vez, por lo que no es accesible instantáneamente. En teoría, el constructor estático podría tardar una cantidad ilimitada de tiempo. Dónde se almacena (o cualquier otra clase) es un detalle de implementación, que no es realmente relevante para esta pregunta. - jmoreno

Otra ventaja de un singleton es que se puede serializar fácilmente, lo que puede ser necesario si necesita guardar su estado en un disco o enviarlo a algún lugar de forma remota.

Respondido 08 ago 11, 04:08

No soy un gran teórico de OO, pero por lo que sé, creo que la única característica de OO de la que carecen las clases estáticas en comparación con los Singleton es el polimorfismo. Pero si no lo necesita, con una clase estática, por supuesto, puede tener herencia (no estoy seguro de la implementación de la interfaz) y encapsulación de datos y funciones.

El comentario de Morendil, "El estilo de diseño encarnado en una clase estática es puramente procedimental" Puede que esté equivocado, pero no estoy de acuerdo. En los métodos estáticos, puede acceder a miembros estáticos, que serían exactamente lo mismo que los métodos singleton que acceden a sus miembros de instancia única.

editar:
De hecho, ahora estoy pensando que otra diferencia es que una clase estática es instanciado al inicio del programa * y permanece durante todo el ciclo de vida del programa, mientras que un singleton se instancia explícitamente en algún momento y también se puede destruir.

* o puede crearse una instancia en el primer uso, según el idioma, creo.

Respondido 09 Feb 12, 14:02

Sí, todos los demás parecen ignorar el hecho de que una clase con métodos estáticos también puede tener campos estáticos privados que aún puede usar para mantener el estado (y exponer algunos de ellos al código del cliente a través de establecedores / captadores estáticos públicos). - user289463

Para ilustrar el punto de Jon, lo que se muestra a continuación no se puede hacer si Logger fuera una clase estática. SomeClass espera una instancia de ILogger implementación para pasar a su constructor.

La clase singleton es importante para que sea posible la inyección de dependencia.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            var someClass = new SomeClass(Logger.GetLogger());
        }


    }

    public class SomeClass 
    {
        public SomeClass(ILogger MyLogger)
        {

        }
    }

    public class Logger : ILogger
    {
        private static Logger _logger;
        private Logger() { }

        public static Logger GetLogger()
        {
            if (_logger==null)
            {
                _logger = new Logger();
            }

            return _logger;
        }

        public void Log()
        {

        }

    }


    public interface ILogger
    {
         void Log();
    }
}

Respondido el 10 de junio de 13 a las 00:06

Bueno, un singleton es solo una clase normal que ES instanciada pero solo una vez e indirectamente desde el código del cliente. No se crea una instancia de la clase estática. Hasta donde yo sé, los métodos estáticos (la clase estática debe tener métodos estáticos) son más rápidos que los no estáticos.

Edit:
Descripción de la regla de rendimiento de FxCop: "Los métodos que no acceden a los datos de la instancia o llaman a los métodos de la instancia se pueden marcar como estáticos (Compartidos en VB). Después de hacerlo, el compilador emitirá sitios de llamada no virtuales a estos miembros, lo que evitará una verificación en tiempo de ejecución para cada llamada que asegura que el puntero del objeto actual no es nulo. Esto puede resultar en una ganancia de rendimiento medible para el código sensible al rendimiento. En algunos casos, la falla al acceder a la instancia del objeto actual representa un problema de corrección ".
En realidad, no sé si esto se aplica también a los métodos estáticos en clases estáticas.

Respondido 10 Feb 09, 11:02

Singleton's son instanciados, es solo que solo hay una instancia instanciada, de ahí el soltero en Singleton

Una clase estática no puede ser instanciada por otra cosa que no sea ella misma.

Respondido 06 Feb 09, 08:02

La clase estática se puede instanciar mucho en java. Lea docs.oracle.com/javase/tutorial/java/javaOO/nested.html. También refiera mi respuesta stackoverflow.com/a/37114702/1406510 - nanosoft

Las principales diferencias son:

  • Singleton tiene una instancia / objeto mientras que la clase estática es un montón de métodos estáticos
  • Singleton se puede extender, por ejemplo, a través de una interfaz, mientras que la clase estática no se puede extender.
  • Singleton se puede heredar, lo que admite principios de apertura / cierre en principios SOLID, por otro lado, la clase estática no se puede heredar y debemos realizar cambios en sí misma.
  • El objeto singleton se puede pasar a métodos mientras que la clase estática, ya que no tiene instancia, no se puede pasar como parámetros

Respondido 28 Abr '18, 17:04

Singleton es un mejor enfoque desde la perspectiva de las pruebas. A diferencia de las clases estáticas, singleton podría implementar interfaces y puede usar una instancia simulada e inyectarlas.

En el siguiente ejemplo ilustraré esto. Suponga que tiene un método isGoodPrice () que usa un método getPrice () e implementa getPrice () como método en un singleton.

singleton que proporciona la funcionalidad getPrice:

public class SupportedVersionSingelton {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        // calculate price logic here
        return 0;
    }
}

Uso de getPrice:

public class Advisor {

    public boolean isGoodDeal(){

        boolean isGoodDeal = false;
        ICalculator supportedVersion = SupportedVersionSingelton.getInstance();
        int price = supportedVersion.getPrice();

        // logic to determine if price is a good deal.
        if(price < 5){
            isGoodDeal = true;
        }

        return isGoodDeal;
    }
}


In case you would like to test the method isGoodPrice , with mocking the getPrice() method you could do it by:
Make your singleton implement an interface and inject it. 



  public interface ICalculator {
        int getPrice();
    }

Implementación final de Singleton:

public class SupportedVersionSingelton implements ICalculator {

    private static ICalculator instance = null;

    private SupportedVersionSingelton(){

    }

    public static ICalculator getInstance(){
        if(instance == null){
            instance = new SupportedVersionSingelton();
        }

        return instance;
    }

    @Override
    public int getPrice() {
        return 0;
    }

    // for testing purpose
    public static void setInstance(ICalculator mockObject){
        if(instance != null ){
instance = mockObject;
    }

clase de prueba:

public class TestCalculation {

    class SupportedVersionDouble implements ICalculator{
        @Override
        public int getPrice() { 
            return 1;
        }   
    }
    @Before
    public void setUp() throws Exception {
        ICalculator supportedVersionDouble = new SupportedVersionDouble();
        SupportedVersionSingelton.setInstance(supportedVersionDouble);

    }

    @Test
    public void test() {
          Advisor advidor = new Advisor();
          boolean isGoodDeal = advidor.isGoodDeal();
          Assert.assertEquals(isGoodDeal, true);

    }

}

En caso de que tomemos la alternativa de usar un método estático para implementar getPrice (), fue difícil simular getPrice (). Puede simular estática con simulacro de potencia, pero no todos los productos pueden usarlo.

Respondido 13 Abr '14, 14:04

Eso ahora no es seguro para subprocesos y, en general, es desagradable en términos de cómo accede a la implementación de la interfaz. Claro, tener una interfaz es bueno para la capacidad de prueba, pero entonces ¿por qué molestarse con un singleton? Simplemente evite tener un singleton en absoluto; tener una clase que lo implemente para fines de producción, una implementación para fines de prueba e inyecte la instancia correcta según lo que esté haciendo. No es necesario acoplar el singleton a sus interlocutores. - jon skeet

Gracias por la respuesta. es muy simple hacerlo seguro para subprocesos. Además, utilizo singleton con fines de almacenamiento en caché. - Amir Bareket

Sí, aunque con gastos generales inútiles. Nuevamente, es más sencillo no usar un singleton. - jon skeet

Estoy de acuerdo con esta definición:

La palabra "soltero"significa un solo objeto en todo el ciclo de vida de la aplicación, por lo que el alcance está en el nivel de la aplicación.

El estático no tiene ningún puntero de objeto, por lo que el alcance está en el nivel del dominio de la aplicación.

Además, ambos deben implementarse para ser seguros para subprocesos.

Puede encontrar otras diferencias interesantes sobre: Patrón singleton versus clase estática

Respondido 11 Feb 16, 15:02

Distinción de la clase estática

JDK tiene ejemplos tanto de singleton como estático, por un lado java.lang.Math es una clase final con métodos estáticos, por otro lado java.lang.Runtime es una clase singleton.

Ventajas del singleton

  • Si su necesidad de mantener el estado que el patrón singleton es una mejor opción que la clase estática, porque mantener el estado en la clase estática conduce a errores, especialmente en un entorno concurrente, que podrían conducir a condiciones de carrera sin una modificación paralela de sincronización adecuada por parte de varios subprocesos.

  • La clase Singleton puede cargarse de forma diferida si es un objeto pesado, pero la clase estática no tiene tales ventajas y siempre se carga con entusiasmo.

  • Con singleton, puede usar la herencia y el polimorfismo para extender una clase base, implementar una interfaz y proporcionar diferentes implementaciones.

  • Dado que los métodos estáticos en Java no se pueden anular, conducen a la inflexibilidad. Por otro lado, puede anular los métodos definidos en la clase singleton extendiéndola.

Desventajas de la clase estática

  • Es más fácil escribir una prueba unitaria para singleton que para clase estática, porque puede pasar un objeto simulado siempre que se espere singleton.

Ventajas de la clase estática

  • La clase estática proporciona un mejor rendimiento que singleton, porque los métodos estáticos se enlazan en tiempo de compilación.

Hay varias realizaciones de patrón singleton, cada una con ventajas y desventajas.

  • Singleton de carga ansioso
  • Singleton de bloqueo con doble verificación
  • Idioma del titular de inicialización a pedido
  • El singleton basado en enumeración

Descripción detallada de cada uno de ellos es demasiado detallado, así que solo puse un enlace a un buen artículo: Todo lo que quieres saber sobre Singleton

contestado el 07 de mayo de 20 a las 03:05

Una diferencia notable es la creación de instancias diferenciada que viene con Singletons.

Con las clases estáticas, CLR lo crea y no tenemos control sobre él. con singletons, se crea una instancia del objeto en la primera instancia en la que se intenta acceder.

Respondido el 27 de junio de 12 a las 15:06

  1. Lazy Loading
  2. Soporte de interfaces, para que se pueda proporcionar una implementación separada
  3. Capacidad para devolver el tipo derivado (como una combinación de carga diferida e implementación de interfaz)

contestado el 08 de mayo de 12 a las 17:05

La clase estática anidada puede implementar una interfaz en java. Tu segundo punto es incorrecto. - nanosoft

En muchos casos, estos dos no tienen ninguna diferencia práctica, especialmente si la instancia de singleton nunca cambia o cambia muy lentamente, por ejemplo, manteniendo configuraciones.

Yo diría que la mayor diferencia es que un singleton sigue siendo un Java Bean normal en oposición a una clase Java especializada solo estática. Y debido a esto, un singleton se acepta en muchas más situaciones; de hecho, es la estrategia de creación de instancias del Spring Framework por defecto. El consumidor puede saber o no que se está pasando un singleton, simplemente lo trata como un bean Java normal. Si los requisitos cambian y un singleton necesita convertirse en un prototipo, como vemos a menudo en Spring, se puede hacer sin problemas sin una línea de cambio de código para el consumidor.

Alguien más ha mencionado anteriormente que una clase estática debe ser puramente procedimental, por ejemplo, java.lang.Math. En mi opinión, una clase de este tipo nunca debe pasarse y nunca debe contener nada que no sea el final estático como atributos. Para todo lo demás, use un singleton, ya que es mucho más flexible y fácil de mantener.

Respondido el 07 de junio de 12 a las 02:06

Tenemos nuestro marco de base de datos que hace conexiones con el back end. Para evitar lecturas sucias en varios usuarios, hemos utilizado el patrón singleton para asegurarnos de tener una sola instancia disponible en cualquier momento.

En c #, una clase estática no puede implementar una interfaz. Cuando una clase de instancia única necesita implementar una interfaz para contratos comerciales o propósitos de IoC, aquí es donde uso el patrón Singleton sin una clase estática

Singleton proporciona una forma de mantener el estado en escenarios sin estado

Espero que te ayude ...

Respondido el 27 de junio de 12 a las 11:06

En un artículo que escribí, describí mi punto de vista sobre por qué el singleton es mucho mejor que una clase estática:

  1. La clase estática no es realmente una clase canónica, es un espacio de nombres con funciones y variables
  2. El uso de clases estáticas no es una buena práctica debido a que rompe los principios de programación orientada a objetos.
  3. La clase estática no se puede pasar como parámetro para otros
  4. La clase estática no es adecuada para la inicialización "perezosa"
  5. La inicialización y el uso de la clase estática siempre se realiza de forma rígida
  6. Implementar la gestión de subprocesos es difícil

Respondido 07 Jul 16, 16:07

Lo repasaría para la gramática inglesa, pero por lo demás, es una lectura interesante :) - Noctis

Esta es una mejor respuesta, ya que se ocupa del problema específico del caso de uso real en lugar de los detalles de implementación. - Nombre de código Jack

una. Serialización: los miembros estáticos pertenecen a la clase y, por lo tanto, no se pueden serializar.

B. Aunque hemos hecho que el constructor sea privado, las variables miembro estáticas aún se llevarán a la subclase.

C. No podemos hacer una inicialización diferida ya que todo se cargará solo al cargar la clase.

Respondido el 14 de enero de 14 a las 17:01

Desde la perspectiva del cliente, el cliente conoce el comportamiento estático, pero el comportamiento Singleton puede completarse oculto al cliente. Es posible que el cliente nunca sepa que solo hay una instancia con la que está jugando una y otra vez.

Respondido 04 ago 14, 07:08

Leí lo siguiente y creo que también tiene sentido:

Taking Care of Business

Recuerde, una de las reglas de OO más importantes es que un objeto es responsable de sí mismo. Esto significa que los problemas relacionados con el ciclo de vida de una clase deben manejarse en la clase, no delegarse a construcciones del lenguaje como estático, etc.

del libro Proceso de pensamiento orientado a objetos 4ª ed.

Respondido el 20 de junio de 20 a las 10:06

No estaría de acuerdo, ya que esto realmente solo agrega una responsabilidad a la clase, lo que (asumiendo que hace algo) significa que ahora viola el Principio de Responsabilidad Única. - ssmith

  1. Podemos crear el objeto de la clase singleton y pasarlo al método.

  2. La clase Singleton no tiene ninguna restricción de herencia.

  3. No podemos deshacernos de los objetos de una clase estática, pero sí de la clase singleton.

Respondido 18 Oct 16, 19:10

¿De qué sirve pasar un singleton a un método si siempre hay solo uno y ese siempre tiene una referencia estática? - aarón franco

Hay una gran diferencia entre un clase estática única instancia (es decir, una sola instancia de una clase, que resulta ser una variable estática o global) y una puntero estático único a una instancia de la clase en el montón:

Cuando su aplicación salga, se llamará al destructor de la instancia de clase estática. Eso significa que si usó esa instancia estática como singleton, su singleton dejó de funcionar correctamente. Si todavía hay un código en ejecución que usa ese singleton, por ejemplo, en un hilo diferente, es probable que ese código se bloquee.

contestado el 19 de mayo de 16 a las 20:05

Entonces, si la aplicación sale, ¿Singleton aún permanecerá en la memoria? - nanosoft

Creo que te refieres a cuando sale tu hilo actual, no a la aplicación, ¿verdad? Si la aplicación se cierra, no hay forma de que otro hilo use nada de ella. - El estudiante

La diferencia en mi cabeza es implementar programación orientada a objetos (Singleton / Prototype) o programación funcional (Static).

Estamos demasiado enfocados en la cantidad de objetos creados por patrón singleton cuando lo que deberíamos enfocarnos es que al final sostenemos un objeto. Como ya han dicho otros, se puede extender, pasar como parámetro, pero lo más importante es que está lleno de estado.

Por otro lado, la estática se utiliza para implementar la programación funcional. Los miembros estáticos pertenecen a una clase. Son apátridas.

Por cierto, ¿sabías que puedes crear clases estáticas singleton :)

Respondido el 08 de Septiembre de 17 a las 10:09

¿Cuál es el punto de pasar un singleton como parámetro ya que siempre tiene una referencia estática en la clase? - aarón franco

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.