È noto che Singletons è anti-pattuglia per diversi motivi:
- accoppiamento stretto
- singletons sono bugiardi patologici
- nessuna testabilità
- l'ereditarietà non è disponibile
- non puoi programmare interfacce, programmi alle implementazioni
Ma c'è il codice:
class ISingleton
{
protected:
ISingleton() {}
public:
virtual ISingleton& getInstance() = 0;
virtual void doSomething() = 0;
virtual ~ISingleton(){}
};
class SingletonA : public ISingleton
{
public:
virtual SingletonA& getInstance() override
{
static SingletonA instance;
return instance;
}
virtual void doSomething() override
{
}
};
class SingletonB : public ISingleton
{
public:
virtual SingletonB& getInstance() override
{
static SingletonB instance;
return instance;
}
virtual void doSomething() override
{
}
};
class DependsOnSingleton
{
private:
ISingleton& m_singleton;
public:
DependsOnSingleton(ISingleton& singleton)
: m_singleton {singleton}
{
}
void use()
{
m_singleton.doSomething();
}
};
Vedi qualche problema nel codice sopra elencato? E assicura completamente che possa essere creata una singola istanza. Potete vedere qui che viene usata l'iniezione diretta delle dipendenze, potrebbe anche essere usata con i contenitori DI. Penso che le persone non capiscano cosa sia Singleton. Mi manca qualcosa?