Proprio l'altro giorno ho visto il codice che utilizza il cosiddetto modello singleton. Significa qualcosa sulla falsariga diSingleton - Perché usare le classi?
class MySingleton{
public:
void foo() { ... }
static MySingleton&get_instance(){
static MySingleton singleton;
return singleton
}
private:
MySingleton(){ ... }
~MySingleton(){ ... }
int bar;
};
Io vedo perché uno vorrebbe farlo:
- Effettuare l'istanza globalmente accessibile.
- Assicurarsi che non ci sia mai più di un'istanza di quella classe.
Tuttavia non vedo perché questo modo di fare è superiore a un paio di funzioni libere. Il modo in cui mi piacerebbe implementare è quello di mettere
namespace some_name{
void foo();
}
nell'intestazione e
namespace some_name{
void foo(){
...
}
}
nel file di implementazione. Se ho bisogno di inizializzazione e/o la pulizia io o aggiungere un paio di funzioni che devono essere chiamati in modo esplicito o aggiungo
namespace{
class Dummy{
Dummy(){ ... }
~Dummy(){ ... }
}dummy;
}
nel file di implementazione.
So che questo è da un punto di vista semantico un singleton, tuttavia vedo la prima variante usata molto più spesso in C++ Code rispetto alla seconda. Perché? Considero la seconda versione leggermente superiore, quindi mi chiedo se mi manca qualcosa di ovvio.
- La seconda versione è più semplice da implementare e meno soggetta a errori. Nella prima variante manca apposta la funzione di costruzione di copia privata per dimostrarlo. Nella seconda variante non c'è modo di fare questo errore.
- L'implementazione e l'interfaccia sono meglio separate nella seconda versione. Nel primo tutti i membri privati devono essere dichiarati nell'intestazione. Questo ha il vantaggio di poter riscrivere l'implementazione da zero e non è nemmeno necessario ricompilare nulla che usi il singleton. Quando si utilizza la prima variante è molto probabile che sia necessario ricompilare tutto il codice utente anche cambiando solo i minimi dettagli di implementazione.
- I dettagli di implementazione sono nascosti in entrambi i casi. Nella prima variante usando private e nella seconda variante usando namespace senza nome.
Potete spiegarmi perché tutti usano la prima variante? Non vedo un singolo vantaggio rispetto al buon vecchio modo di fare le cose in C.
non hai bisogno di un costruttore di copia del pattern Singleton. L'intero scopo del modello singleton è assicurarsi che sia possibile creare una sola e unica istanza della classe. – erelender
Quando si parla di single, è necessario aggiungere che single sono un modello * * Design male e dovrebbe essere evitato per ragioni esposte qui: http://stackoverflow.com/questions/1392315/problems-with-singleton-pattern –
fanatici sono così divertente –