2010-11-28 35 views
5

Duplicar posible:
C++ singleton vs completely static objectmétodos estáticos C++ Singleton Vs

Hola,

por qué debería preferir un producto único sobre los métodos estáticos de clase.

MoneyPrinter::addJob(PrinterJob &job); 
or 
    MoneyPrinter::getInstance().addJob(PrinterJob &job); 

¿Es solo una cuestión de estilo? ¿Qué usas? ¿Por qué?

ps. Sé que los sigletons no son enhebrables (primera inicialización) de manera predeterminada.

+0

¿quién dice que deberías preferirlas? –

+0

Estoy de acuerdo con el duplicado, excepto que nunca fue respondido allí. –

+0

Creo que tiene un error tipográfico para el ejemplo singleton: MoneyPrinter :: GetInstance(). AddJob (PrinterJob &job); – T33C

Respuesta

2

un producto único le da control sobre cuando la clase se instancia y como señala DeadMG si desea crear una instancia. Una clase estática es menos controlable y se crea una instancia antes de llamar a main.

La secuencia en la que se instancian las clases a veces puede ser crítica cuando el singleton depende de alguna otra clase o recurso que no está disponible antes de llamar a main.

Como mencionaste, si llamas a un singleton desde varios hilos, debes asegurarte de haber utilizado un singleton seguro para hilos. Scott Meyer's (de Effective C++) no es seguro para subprocesos, por ejemplo.

+0

Siempre puede manipular cualquier información secreta y estática dentro del archivo de implementación del "Singleton" estático. De hecho, puede usar una estructura de clase completa y luego la diferencia entre cualquiera de los varios singletons y esta cosa estática es puramente sintáctica. –

+0

@Noah - Yo diría que las diferencias también son semánticas y que giowck hizo una buena pregunta porque ambos enfoques deben ser considerados y entendidos. – T33C

3

La regla general de los singleton es, si tiene que preguntar, no la use. Esto es cierto para cualquier estado globalmente mutable.

+0

Me encanta esta regla. Tan corto, pero tan verdadero e importante. – delnan

+10

-1 porque no trata la pregunta en absoluto. –

5

¿por qué debería preferir un producto único sobre los métodos estáticos de clase

un conjunto unitario puede tener estado interno (en su ejemplo, la lista de trabajos añadidos), es decir, los datos de los miembros de la clase Singleton.

¿Qué usas? ¿Por qué?

Si no hay estado, entonces hay un método estático porque es más simple.

De lo contrario, un singleton, preferiblemente estático-inicializado (en lugar de just-in-time o run-time initialized).

+6

Podría haber estado con métodos estáticos, simplemente serían variables estáticas. –

+1

Si no hay estado, ¿por qué hacer una clase con métodos estáticos solo que nunca será instanciado * en un lenguaje que no tiene un todo-debe-ser-en-uno-clase-fetiche *?Simplemente haga que sea un conjunto de funciones, tal vez en un espacio de nombres apropiado. – delnan

+0

@Billy ONeal - Si hay variables estáticas para crear una instancia, entonces son similares a un singleton y preferiría agruparlas dentro de la clase singleton – ChrisW

2

Sería más difícil refactorizar el Singleton-ness simplemente por la sintaxis utilizada si utiliza funciones de miembro estático. Hay una razón.