Ho letto opinioni diverse sul modello singleton. Alcuni sostengono che dovrebbe essere evitato a tutti i costi e altri che può essere utile in determinate situazioni.
Una situazione in cui uso i singleton è quando ho bisogno di una factory (diciamo un oggetto f di tipo F) per creare oggetti di una certa classe A. La factory viene creata una volta usando alcuni parametri di configurazione e quindi viene usata ogni volta che un oggetto di il tipo A è istanziato. Quindi ogni parte del codice che vuole creare un'istanza A recupera il singleton f e crea la nuova istanza, ad es
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Quindi il mio scenario generale è quello
- Ho bisogno di una sola istanza di una classe o per motivi di ottimizzazione (non ho bisogno di più oggetti factory) o per condividere lo stato comune (ad esempio, la factory sa quante istanze di A può ancora creare)
- Ho bisogno di un modo per avere accesso a questa istanza f di F in diversi punti del codice.
Non sono interessato alla discussione se questo modello è buono o cattivo, ma supponendo che io voglia evitare di usare un singleton, quale altro modello posso usare?
Le idee che avevo erano (1) di ottenere l'oggetto factory da un registro o (2) di creare la factory ad un certo punto durante l'avvio del programma e quindi passare la factory come parametro.
Nella soluzione (1), il registro stesso è un singleton, quindi ho appena spostato il problema di non utilizzare un singleton dalla fabbrica al registro.
Nel caso (2) ho bisogno di qualche sorgente iniziale (oggetto) da cui proviene l'oggetto factory, quindi temo di ricadere di nuovo in un altro singleton (l'oggetto che fornisce la mia istanza factory). Seguendo questa catena di singleton posso forse ridurre il problema a un singleton (l'intera applicazione) con il quale tutti gli altri singleton sono gestiti direttamente o indirettamente.
Quest'ultima opzione (usando un singleton iniziale che crea tutti gli altri oggetti unici e inietta tutti gli altri singleton nei posti giusti) sarebbe una soluzione accettabile? È questa la soluzione implicitamente suggerita quando si consiglia di non usare i singoli, o quali sono le altre soluzioni, ad esempio nell'esempio sopra illustrato?
MODIFICARE
Dal momento che penso che il punto della mia domanda sia stato frainteso da alcuni, ecco alcune ulteriori informazioni. Come spiegato ad esempio qui , la parola singleton può indicare (a) una classe con un singolo oggetto istanza e (b) un modello di progettazione utilizzato per creare e accedere a tale oggetto.
Per rendere le cose più chiare, usiamo il termine oggetto unico per (a) e il modello singleton per (b). Quindi, so quali sono il pattern singleton e l'iniezione di dipendenza (BTW, ultimamente ho usato DI pesantemente per rimuovere le istanze del pattern singleton da un codice su cui sto lavorando).
Il mio punto è che, a meno che l'intero grafico a oggetti non sia istanziato da un singolo oggetto residente nello stack del metodo principale, ci sarà sempre la necessità di accedere ad alcuni oggetti unici attraverso il modello singleton.
La mia domanda è se avere la creazione e il cablaggio completi degli oggetti grafici dipendono dal metodo principale (ad es. Tramite un potente framework DI che non utilizza il modello stesso) è l'unica soluzione libera per il modello singleton .