it-swarm.it

Qual è la differenza tra metodi all-static e applicazione di un modello singleton?

Sto creando un database per archiviare informazioni sugli utenti del mio sito Web (sto usando stuts2 e quindi Java tecnologia EE). Per il database realizzerò un DBManager. Dovrei applicare qui il modello singleton o piuttosto rendere statici tutti i suoi metodi?

Userò questo DBManager per cose di base come l'aggiunta, la cancellazione e l'aggiornamento dei profili utente. Insieme ad esso, userò per tutti gli altri scopi di query, ad esempio per scoprire se esiste già un nome utente e per ottenere tutti gli utenti per scopi amministrativi e cose del genere.

Le mie domande

  • Qual è il vantaggio del modello singleton?
  • Qual è la cosa più adatta qui? Tutti i metodi statici o un modello singleton?
  • Si prega di confrontare entrambi.

Post scriptum Il database è più grande di questo. Qui sto parlando solo delle tabelle che userò per la memorizzazione delle informazioni dell'utente.

28
shahensha

Perché Singleton e il metodo statico sono le tue uniche opzioni?

Dal mio punto di vista, entrambe le opzioni sono piuttosto pessime. Leggi su Singleton AntiPattern . La maggior parte dei casi d'uso del modello Singleton non è corretta.

Nel tuo caso, userei un oggetto di istanza e userei l'iniezione di dipendenza (se stai usando un framework DI) o un Localizzatore di servizio/Pattern di registro

20
Tazzy531

Con una classe singleton, hai un maggiore controllo in termini di come gestisci l'oggetto che viene creato.

Innanzitutto, un singleton è un oggetto. Il metodo statico restituisce un'istanza dell'oggetto e consente di creare solo una singola istanza o più, se lo si desidera.

I singleton sono anche carichi di risorse, il che significa che non vengono istanziati fino alla prima volta che vengono chiamati.

Un singleton non usa metodi statici, quindi non avrai problemi ad usarlo in un contesto non statico.

I singleton possono essere estesi/suddivisi in sottoclassi.

Dal momento che sono oggetti, possono essere iniettati in altri oggetti, che consentono la creazione di alcuni fantastici modelli di progettazione che utilizzano i concetti di iniezione di dipendenza. Ad esempio, è così che funziona il modello IoC di Spring Bean (Inversion of Control Dependency Injection).

15
jmort253

Nessuno dei due è l'ideale, ma soprattutto non un mucchio di statica. Ecco un esempio del mondo reale dalla mia esperienza. Abbiamo parlato con un database. Tutti dicevano "ce ne sarà solo uno", quindi qualcuno ha usato un singleton standard configurato da Spring. Quindi è stato aggiunto un nuovo requisito: essere in grado di copiare i nostri dati in n altro (remoto) database. Ops. Dato che avevamo un vero oggetto che rappresentava il DB, e questa era una funzione "usata raramente", sono stato in grado di hackerarlo facendo una copia temporanea e cambiando campi e valori, ma se fosse stato implementato con statica globale sarebbe stato un vero disastro.

Nella mia esperienza, quando "loro" dicono che ci sarà solo un DB, un utente, un'applicazione, una finestra principale, ecc., "loro" sono sbagliati. Con un Singlton hai almeno un'occasione per refactoring e ripararlo.

3
user949300

Qual è la differenza tra metodi all-static e applicazione di un modello singleton?

Entrambi hanno lo stesso effetto: puoi chiamare un metodo di classe senza preoccuparti di come ottenere un'istanza della classe che contiene il metodo.

Tuttavia, se si desidera implementare i metodi statici Unittesting sono più problematici perché non possono essere facilmente derisi .

Dal punto di vista del test è più semplice riscrivere il codice che utilizza i singelton per renderli non leggibili con le beffe.

L'anima più flessibile sarebbe avere Dependency_injection non importa se stai usando un framework di-container (come suggerito da @ Tazzy531) o se stai collegando le dipendenze per codice.

3
k3b

Spero che questo risponda solo alla domanda principale qui.

Ci sono già alcune grandi risposte in SO . Li citerò e basta.

Migliore risposta, di Heinzi :

Un singleton viene utilizzato per introdurre una sorta di stato globale in un'applicazione. Se è apolide, anche io non vedo il punto di usare un singleton, a meno che

  • ti aspetti di estenderlo con lo stato nel prossimo futuro o
  • hai bisogno di un'istanza di oggetto per qualche motivo tecnico (ad esempio, per l'istruzione C # SyncLock, sebbene questo sia già abbastanza inverosimile) o
  • hai bisogno dell'ereditarietà, cioè vuoi poter sostituire facilmente il tuo singleton con un altro usando la stessa interfaccia ma un'implementazione diversa. Ad esempio, il metodo Toolkit.getDefaultToolkit() in Java restituirà un singleton il cui tipo esatto dipende dal sistema.

Commento rilevante, di back2dos :

(...) i singoli sono usati in modo improprio per introdurre stati globali. Lo scopo di un singleton non è rendere un oggetto disponibile a livello globale, ma imporre che un oggetto sia istanziato una sola volta. Gli oggetti globali sono un male necessario. A meno che non sia realmente necessario, si dovrebbe cercare di non usarli, dal momento che generalmente portano a un elevato accoppiamento, con SomeSingleton.getInstance (). SomeMethod () dappertutto.

tzaman ha anche scritto una buona risposta:

Ho potuto vedere un caso per un singleton senza stato utilizzato invece di una classe di metodi statici, vale a dire Dependency Injection .

Se hai una classe helper di funzioni di utilità che stai utilizzando direttamente, crea una dipendenza nascosta; non hai alcun controllo su chi può usarlo o dove. L'iniezione di quella stessa classe helper tramite un'istanza singleton senza stato consente di controllare dove e come viene utilizzata e sostituirla/deriderla/ecc. Quando è necessario.

Renderlo un'istanza singleton assicura semplicemente che non stai allocando più oggetti del tipo del necessario (poiché ne hai sempre bisogno).

E infine Sebastien ha anche risposto abbastanza bene:

In realtà ho trovato un'altra risposta non menzionata qui: i metodi statici sono più difficili da testare.

Sembra che la maggior parte dei framework di test funzionino benissimo per i metodi di istanza beffardi, ma molti di loro non gestiscono in modo decente la simulazione dei metodi statici.

Detto questo, ti consiglio di usare Toolbox pattern .

2
cregox