Singleton Usage

0

Ambiente :

Ho bisogno di condividere alcune informazioni gentili (vedi HashMap) attraverso diverse parti del mio codice. Penso che Singleton potrebbe essere un modello di design perfetto, tranne che per una cosa:

Il recupero di informazioni (leggere init HashMap e popolarlo) richiede una classe (MVC). Quindi, la mia domanda:

è possibile assegnare alla mia classe Singleton queste informazioni da una classe esterna, se sì, come?

Ed è un buon uso del modello di design Singleton? Altrimenti, cosa potresti consigliarmi?

Ho una classe manager che popola questa Hashmap. HashMap contiene informazioni su "Utenti". Ora, il mio manager avvia n thread. Ogni thread apre una connessione a db. Nel gestore di classe Db, devo verificare se questa query contiene utenti nella mia HashMap.

Quindi al momento ho: Manager - > Discussioni - > DBHandler

Voglio evitare di passare la mia HashMap a ogni costruttore. Ecco perché ho pensato a Singleton.

Inoltre, la mia HashMap, una volta popolata, è solo una mappa LEGGIBILE.

    
posta Antonio Calì 09.08.2016 - 13:13
fonte

4 risposte

1

And is a good usage of Singleton design pattern?

No

Il modello singleton viene utilizzato per far rispettare l'esistenza di una singola istanza unica di una classe. Non ne hai esplicitamente bisogno. Ha il svantaggio di raggiungere questo mantenendo uno stato globale. Questo è quello che vuoi.

Non scegliere un pattern quando non hai bisogno del suo scopo principale e invece "hai bisogno" di quale sia la parte cattiva del pattern.

Se hai bisogno di uno stato globale nel tuo programma, non c'è bisogno di nascondersi dietro lo schema del singleton. Se hai bisogno di uno stato globale, vai e crea uno stato globale.

Ci sono molti modi per farlo senza avere una semplice variabile globale. Ad esempio, potresti inserire questa attività in un modulo specializzato. La maggior parte dei contenitori per le dipendenze dipenderà da qualcosa come "SingletonLifetime". Questo è non un singleton. Significa solo che ottieni la stessa istanza ogni volta che chiedi al tuo contenitore un'istanza.

Sia che utilizzi un contenitore per le dipendenze o meno, assicurati di iniettare questo stato ovunque ti serva, per rendere il tuo programma modulare e testabile.

    
risposta data 09.08.2016 - 17:08
fonte
5

Consiglio vivamente di allontanarmi da un singleton se possibile. Se hai bisogno che i tuoi diversi componenti facciano riferimento allo stesso oggetto, normalmente guarderei inietti in ogni componente (preferibilmente durante la costruzione).

Per lo meno renderà le unità testando i tuoi componenti molto più facilmente. Ti rimando a questa domanda / risposta SO , che copre tali problemi.

Si affronta il problema di inserire eventualmente questa configurazione in ogni componente. Vorrei prendere una vista di livello superiore e configurare i componenti usando questa configurazione, e quindi iniettare quei componenti, ad es. (in Scala, ma il linguaggio è in gran parte immateriale qui)

val entityDao = new EntityDao(config)
val entityMgr = new EntityManager(entityDao)

assicurando così che i componenti parlino a un livello "più alto" di astrazione, laddove possibile.

    
risposta data 09.08.2016 - 13:56
fonte
3

Potresti lavorare in modo che la classe esterna definisca il singleton, anche se non sarebbe esattamente ciò che le persone si aspettano da un singleton poiché non è sempre disponibile.

Detto questo, non dovresti usare un singleton per questo. Esistono singleton per limitare un tipo alla sola istanza di una sola istanza. Questo è un design eccezionalmente raro e limitante, e nulla di ciò che hai detto mi fa pensare che sia giustificato qui. Sembra che tu voglia solo un globale. Se è quello che vuoi, basta usare un globale.

    
risposta data 09.08.2016 - 13:35
fonte
-1

Il modello Singleton è utile per conservare le informazioni di configurazione che potrebbero richiedere varie parti dell'applicazione. Detto questo, è difficile scrivere test unitari per questo. Pertanto, se devi assolutamente usare singleton nel tuo caso particolare e l'iniezione di dipendenza è fuori questione, scrivi una classe regolare, scrivi test di unità per esso e poi scrivi semplicemente un involucro singleton attorno ad esso, in modo da avere il meglio di entrambi mondi.

    
risposta data 09.08.2016 - 14:11
fonte

Leggi altre domande sui tag