Ci sono pochissimi motivi per sottoclasse un singleton. L'unica ragione potenzialmente accettabile che riesco a pensare è se hai implementazioni specifiche per piattaforma. L'importante è che non aggiungiate nuovi singleton per la stessa cosa. Il modo in cui funzionerebbe è come questo:
public class MySingleton {
private static MySingleton _instance;
static {
// Detect platform
switch(platform) {
case Win32:
_intance = new Win32Singleton();
break;
case Ubuntu:
_instance = new UbuntuSingleton();
break;
default:
_instance = new MySingleton();
break;
}
}
public static MySingleton getInstance() { return _instance; }
protected MySingleton() {}
}
Essenzialmente, il tuo inizializzatore è una fabbrica per istanziare l'istanza appropriata del singleton, ma le seguenti cose devono rimanere vere:
- Solo un posto per accedere al tuo singleton (la classe root)
- I tuoi costruttori sono protetti o accessibili dal pacchetto
Tuttavia
Nei casi in cui sai che avrai implementazioni specifiche per piattaforme è solo più onesto lavorare con una fabbrica per ottenere un'istanza di lavoro per ciò di cui hai bisogno e non preoccuparti dell'intera faccenda di Singleton. I single sono (ancora) abusati anche quando non ci sono reali ragioni per guidarli.
Ogni volta che si progetta un singleton da sottoclasse, si introduce molta complessità che non esisterebbe se solo si concedessero più istanze.