2011-01-06 14 views
7

Sto creando un database per archiviare informazioni sugli utenti del mio sito Web (sto usando stuts2 e quindi la tecnologia Java EE). Per il database farò un DBManager. Dovrei applicare qui il modello di singleton o piuttosto rendere tutti i suoi metodi statici?Qual è la differenza tra i metodi all-static e l'applicazione di un modello singleton?

Utilizzerò questo DBManager per elementi di base come l'aggiunta, l'eliminazione 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 a scopi amministrativi e cose del genere.

Le mie domande

  • Qual è il vantaggio di pattern Singleton?
  • Qual è la cosa più adatta qui? Tutti i metodi statici o uno schema singleton?
  • Si prega di confrontare entrambi.

riguarda

shahensha

P.S. Il database è più grande di questo. Qui sto parlando solo delle tabelle che userò per la memorizzazione delle informazioni utente.

risposta

8

Devo rivolgermi pattern Singleton qui o meglio rendere tutti i suoi metodi statici?

Nessuno di entrambi. Just create one.

In un semplice contenitore servlet, è possibile utilizzare ServletContextListener per questo. Durante l'avvio di webapp, creane uno e inseriscilo nello scope dell'applicazione entro ServletContext#setAttribute(). Sarà disponibile per tutti i servlet durante la vita di webapp. Per un esempio di kickoff di base, potresti trovare utile this article.

1

Non conosco i componenti interni di EE, ma in genere la differenza tra una classe statica e un Singleton è l'istanziazione: con la classe statica non esiste un'istanza reale, nessun dato membro, nessun riferimento a un oggetto. Quindi la differenza pratica è ... non molto.

Penso che il vero vantaggio qui sia concettuale ... i metodi e le proprietà statici sono metodi che si applicano al concetto astratto della classe e non a un'istanza particolare. Se crei qui un oggetto utente singleton, chi è quell'utente? Perché ha il contesto particolare per creare e aggiornare i profili? Non penso che le mappe concettuali siano molto buone.

Ha molto più senso dire UserProfile.Update (nome utente, password, firstName ...). Stai dicendo "Esegui l'attività Aggiorna dal concetto astratto di Profilo utente su questo particolare insieme di dati".

Tenete presente che il mio uso della parola abstract è strettamente figurativo e non nel senso scientifico del termine.

1

Non molta differenza pratica, ma piuttosto una differenza filosofica.

Vorrei raccomandare l'approccio Singleton qui: si sta descrivendo un tipo di Data Access Object (DAO), anche se ad un livello elevato.

Alcune riflessioni sul perché:

  • A Factory approccio stile alla creazione del DBManager sé (vale a dire, DBManagerFactory) renderebbe più facile Unit Testing; si presta al modello di iniezione delle dipendenze.

  • Una classe con un gruppo di metodi statici è generalmente considerata come un tipo di classe switchblade/utility senza alcun tema di over-arc (cioè, indipendenza tra i metodi). Pensa ad una classe come StringUtils - la gente presume che non ci sia uno stato generale per la classe.

  • A un livello non comune, con l'approccio "tutti i metodi statici", si crea un sacco di lavoro per te in quanto è necessario continuare a digitare statico per ogni metodo. Di nuovo, si può semplicemente avere un DBManagerFactory che ha semplicemente un singolo metodo statico per la creazione di DBManager, che finisce per essere un singleton.

Problemi correlati