Singleton o istanziare ogni volta che uso? [duplicare]

14

Uso una classe che estrae solo i dati da un oggetto conosciuto e la distribuisce ad altri oggetti conosciuti. Nessuna configurazione persistente o tale è necessaria in quell'istanza di classe.

Come dovrei decidere se impostare quella classe come singleton , o semplicemente istanziarla ogni volta che ne ho bisogno ?

    
posta bebbi 15.09.2015 - 10:18
fonte

4 risposte

35

Se la classe non ha uno stato, potresti considerare di trasformarla in una funzione o in un metodo statico in base alla tua lingua.

    
risposta data 15.09.2015 - 10:48
fonte
23

Talvolta si ritiene che il singleton sia un anti-pattern . A meno che il problema non sia risolto specificamente richiede l'uso del modello singleton, in genere è meglio evitarlo.

Hai detto che la funzione non avrebbe uno stato o altri requisiti a lungo termine, quindi l'esigenza immediata di un oggetto non è lì .

Una funzione gratuita sarebbe la migliore (o funzione statica o simile data la lingua e il target), poiché non porta nessuno stato e non introduce alcun problema associato al singleton.

Se una funzione libera non è un'opzione, un oggetto vuoto (nessun membro dati) probabilmente sarebbe un'opzione seconda abbastanza vicina.

In generale, il mio consiglio nella scelta di un modello è capire innanzitutto quale problema il modello cerca di risolvere e quali sarebbero i limiti e i vincoli del modello. Una volta capito, se il problema da risolvere rientra nello spazio del problema di quel modello, allora quel modello sarebbe un candidato per l'uso.

    
risposta data 15.09.2015 - 11:34
fonte
4

Come si determinano cosa sono questi 'oggetti conosciuti' - se il codice è codificato (ovvero l'oggetto è statico o singleton stesso) allora si potrebbe anche usare un metodo statico per eseguire l'elaborazione, basta chiamarlo se necessario.

Non riesco a capire perché avresti bisogno di un'intera classe per questo processo, a meno che quegli oggetti conosciuti non siano considerati internamente alla classe. In questo caso, dipende da quanto spesso ne hai bisogno e dal costo di costruirlo, ci vuole un sacco di sforzi, un singleton è probabilmente il migliore.

    
risposta data 15.09.2015 - 11:17
fonte
3

Penso che la risposta di Niall sia buona e la risposta accettata sia corretta, ma desidero aggiungere un po 'alla vena dell'uso di Singletons.

Lo schema di Singleton è un po 'come il comunismo. Sembra buono sulla carta, ma quando lo mescoli con le persone le cose tendono a cadere a pezzi.

Il fatto è che il pattern Singleton non è, intrinsecamente, un anti-pattern. È più che la maggior parte (ingenua) delle sue implementazioni tende a sfiorare aspetti importanti o causare possibili problemi.

Ad esempio, in C ++, un Singleton inizializzato a livello globale può essere allocato praticamente ogni volta prima che inizi il ciclo principale. Combinare più Singleton in questo modo significa che non hai idea di quale ordine inizializzeranno l'uno rispetto all'altro. L'ordine di pulizia è allo stesso modo arbitrario (ma generalmente il contrario dell'ordine in cui sono stati inizializzati). (Ci sono alcune regole di base per questo, ma per lo più è lasciato ai demoni nasali .)

Anche gli oggetti globali e facilmente accessibili tendono a virare verso i regni di una classe di Dio , che è molto un anti-modello. Idee come "Ho già una classe Manager, la manterrò lì", sono facili e la soluzione è veloce. Questo è un caso di debito tecnico .

Un Singleton controllato gestito correttamente può essere molto utile e non causare problemi, ma è un modello più difficile da ottenere che le persone tendono ad aspettarsi. La parte peggiore è che gli esempi di libri di testo tendono a insegnare abitudini davvero cattive per Singletons.

Per il tuo caso specifico, poiché non hai uno stato e non hai bisogno di caricare o scaricare, non hai bisogno di un oggetto. Una funzione statica o equivalente dovrebbe soddisfare le tue esigenze.

E, dato che non posso commentare (scuote il pugno) , voglio mettere in secondo piano il punto di Niall sulla comprensione di ciò che un modello risolve e dove funziona. Ti suggerisco inoltre di cercare come funziona e come implementarlo al meglio, poiché implementare correttamente un modello è importante almeno quanto la scelta del modello giusto .

    
risposta data 15.09.2015 - 16:58
fonte

Leggi altre domande sui tag