2011-01-06 20 views
7

Estoy creando una base de datos para almacenar información sobre los usuarios de mi sitio web (estoy usando stuts2 y, por lo tanto, tecnología Java EE). Para la base de datos haré un DBManager. ¿Debería aplicar el patrón singleton aquí o más bien hacer que todos sus métodos sean estáticos?¿Cuál es la diferencia entre todos los métodos estáticos y la aplicación de un patrón singleton?

Voy a utilizar este DBManager para cosas básicas como agregar, eliminar y actualizar perfiles de usuario. Junto con esto, lo utilizaré para todas las demás consultas, por ejemplo, para saber si ya existe un nombre de usuario y para obtener todos los usuarios con fines administrativos y cosas por el estilo.

Mis preguntas

  • Cuál es el beneficio del patrón Singleton?
  • ¿Qué cosa es más adecuada aquí? ¿Todos los métodos estáticos o un patrón singleton?
  • Por favor, comparar ambos.

respecto

shahensha

P. S. La base de datos es más grande que esto. Aquí estoy hablando solo de las tablas que usaré para almacenar la información del usuario.

Respuesta

8

debo aplicar patrón singleton aquí o bien hacer que todos sus métodos estáticos?

Ninguno de los dos. Just create one.

En un servletcontainer simple, puede usar ServletContextListener para esto. Durante el inicio de Webapp, cree uno y póngalo en el alcance de la aplicación al ServletContext#setAttribute(). Estará disponible para todos los servlets durante la vida útil de Webapp. Para un ejemplo básico de inicio, puede encontrar this article útil.

1

No conozco las partes internas de EE, pero normalmente la diferencia entre una clase estática y un Singleton es la creación de instancias: con la clase estática, no hay instanciación real, no hay datos de miembros, no hay referencia a un objeto. Entonces la diferencia práctica es ... no mucho.

Creo que el beneficio real aquí es conceptual ... los métodos y propiedades estáticos son métodos que se aplican al concepto abstracto de la clase, y no a una instancia en particular. Si crea un objeto de usuario único aquí, ¿quién es ese usuario? ¿Por qué tiene el contexto particular para crear y actualizar perfiles? No creo que el concepto se mapee muy bien.

Tengo mucho más sentido para mí decir UserProfile.Update (username, password, firstName ...). Usted está diciendo "realizar la actualización de la tarea desde el concepto abstracto de UserProfile en este conjunto particular de datos".

Tenga en cuenta aquí que mi uso de la palabra abstracto es estrictamente figurativo, y no en el sentido de la ciencia de la informática.

1

No hay mucha diferencia práctica, pero una cierta diferencia filosófica.

Recomendaría el enfoque singleton aquí; realmente está describiendo un tipo de objeto de acceso a datos (DAO), aunque a un alto nivel.

Algunos pensamientos sobre por qué:

  • enfoque de estilo

    una fábrica para la creación de la misma (es decir, DBManagerFactory) DBManager haría más fácil unidad de prueba; se presta al modelo de inyección de dependencia.

  • Generalmente, se considera que una clase con muchos métodos estáticos es una clase de switchblade/utilidad sin un tema general (es decir, independencia entre métodos). Piense en una clase como StringUtils: la gente supone que no hay un estado general para la clase.

  • A un nivel extremo, con el enfoque de "todos los métodos estáticos", está creando mucho trabajo para sí mismo, ya que necesita seguir escribiendo estático para cada método. De nuevo, puede tener un DBManagerFactory que simplemente tenga un único método estático para crear el DBManager, que termina siendo un singleton.

Cuestiones relacionadas