Ho letto opinioni diverse sul modello singleton. Alcuni sostengono che dovrebbe essere evitato a tutti i costi e ad altri che può essere utile in certe situazioni.
Una situazione in cui utilizzo i singleton è quando ho bisogno di una fabbrica (diciamo un oggetto f di tipo F) per creare oggetti di una certa classe A. Il factory viene creato una volta utilizzando alcuni parametri di configurazione e quindi viene utilizzato ogni volta che un oggetto di tipo A viene istanziato. Quindi ogni parte di il codice che vuole istanziare 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 è che
- Ho bisogno di una sola istanza di una classe per ragioni 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 accedere a questa istanza f di F in diverse parti del codice.
Sono non interessato nella discussione se questo modello è buono o cattivo, ma supponendo che voglio evitare di usare un singleton, quale altro pattern posso usare?
Le idee che avevo erano (1) per ottenere l'oggetto fabbrica da un registro o (2) per creare la fabbrica ad un certo punto durante l'avvio del programma e poi passare la fabbrica come parametro.
In soluzione (1), il registro stesso è un singleton, quindi mi sono appena spostato il problema di non usare un singleton dalla fabbrica al registro.
Nel caso (2) ho bisogno di una fonte iniziale (oggetto) da cui l'oggetto factory viene così ho paura che tornerei di nuovo ad un altro singleton (l'oggetto che fornisce la mia istanza di fabbrica). Seguendo indietro questa catena di singleton posso forse ridurre il problema a un singleton (l'intera applicazione) con cui tutti gli altri singleton sono gestiti direttamente o indirettamente.
Avrebbe questa ultima opzione (usando un singleton iniziale che crea tutto il resto oggetti unici e inietta tutti gli altri singleton a destra luoghi) essere una soluzione accettabile? È questa la soluzione che viene implicitamente suggerita quando si consiglia di non farlo usa singleton o altre soluzioni, ad es. nel l'esempio illustrato sopra?
Modifica
Poiché penso che il punto della mia domanda sia stato frainteso da alcuni, ecco alcune ulteriori informazioni Come spiegato ad es. qui , la parola singleton può indicare (a) una classe con un oggetto di istanza singolo 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 modello singleton per (b). Quindi, so qual è il modello singleton e l'iniezione di dipendenza sono (BTW, ultimamente ho usato pesantemente DI rimuovere le istanze del modello singleton da un codice su cui sto lavorando).
Il mio punto è che a meno che l'intero grafico dell'oggetto non sia istanziato da un singolo oggetto che vive sulla pila 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 completa del grafico dell'oggetto e il cablaggio dipende dal metodo principale (ad esempio attraverso un potente framework DI) quello non usa il modello stesso) è l'unico soluzione per singleton .