El otro día he visto código que usa el llamado patrón singleton. Es decir algo en la línea deSingleton - ¿Por qué usar clases?
class MySingleton{
public:
void foo() { ... }
static MySingleton&get_instance(){
static MySingleton singleton;
return singleton
}
private:
MySingleton(){ ... }
~MySingleton(){ ... }
int bar;
};
me veo por qué uno querría hacer eso:
- Haga la instancia accesible a nivel mundial.
- Asegúrese de que nunca haya más de una instancia de esa clase.
Sin embargo, no veo por qué esta forma de hacer las cosas es superior a un par de funciones gratuitas. La forma en que me ponerlo en práctica es poner
namespace some_name{
void foo();
}
en la cabecera y
namespace some_name{
void foo(){
...
}
}
en el archivo de implementación. Si necesito inicialización y/o limpieza que sea añadir un par de funciones que debe ser llamada explícita o añado
namespace{
class Dummy{
Dummy(){ ... }
~Dummy(){ ... }
}dummy;
}
en el archivo de implementación.
Sé que esto es desde un punto de vista semántico un singleton, sin embargo, veo la primera variante utilizada con mucha más frecuencia en C++ Code que la segunda. ¿Por qué? Considero que la segunda versión es ligeramente superior, por lo que me pregunto si me falta algo obvio.
- La segunda versión es más sencilla de implementar y menos propensa a errores. En la primera variante, el constructor de copia privada falta a propósito para demostrar esto. En la segunda variante no hay forma de hacer este error.
- La implementación y la interfaz están mejor separadas en la segunda versión. En el primero, todos los miembros privados deben declararse en el encabezado. Esto tiene la ventaja de que puede reescribir la implementación desde cero y ni siquiera necesita recompilar nada que use el singleton. Cuando se usa la primera variante, es muy probable que tenga que volver a compilar todo el código de usuario incluso cuando solo se modifican los detalles de la implementación.
- Los detalles de implementación están ocultos en ambos casos. En la primera variante, uso privado y, en la segunda, uso de espacios de nombres sin nombre.
¿Puede explicarme por qué todos usan la primera variante? No veo una sola ventaja sobre la buena forma de hacer las cosas en C.
No necesita un constructor de copia en el patrón singleton. El propósito del patrón singleton es asegurarse de que se pueda crear una única instancia de la clase. – erelender
Cuando se discuten singletons, es necesario agregar que los singletons son un patrón de diseño * malo * y deben evitarse por las razones que se mencionan aquí: http://stackoverflow.com/questions/1392315/problems-with-singleton-pattern –
fanáticos son tan divertido –