2011-01-06 55 views
7

我正在制作一个数据库来存储关于我的网站用户的信息(我正在使用stuts2和Java EE技术)。对于数据库,我将创建一个DBManager。我应该在这里应用单例模式,还是让它的所有方法都是静态的?所有静态方法和应用单例模式有什么区别?

我将使用此DBManager用于添加,删除和更新用户配置文件等基本功能。除此之外,我还会使用其他所有查询目的,例如查找用户名是否已存在,并为了管理目的而获取所有用户以及类似的东西。

我的问题

  • 什么是Singleton模式的好处?
  • 这里最适合哪种方式?所有静态方法或单例模式?
  • 请比较两者。

问候

shahensha

附:数据库比这个更大。这里我只谈论我将用于存储用户信息的表格。

回答

8

如果我在这里还是相当适用Singleton模式让所有的方法静态?

两者都不是。 Just create one

在一个简单的servletcontainer中,您可以使用ServletContextListener。在webapp的启动过程中,创建一个并将其放入ServletContext#setAttribute()的应用程序范围中。它将在webapp的整个生命周期中供所有servlet使用。对于基本的启动示例,您可能会发现this article有用。

1

我不知道EE的内部,但通常静态类和单例之间的区别是实例化 - 使用静态类,没有实际的实例化,没有成员数据,没有对象的引用。所以实际的区别是...并不多。

我认为这里真正的好处是概念...静态方法和属性是适用于类的抽象概念而不适用于特定实例的方法。如果你在这里创建一个单例用户对象,那个用户是谁?为什么他有特定的上下文来创建和更新配置文件?我不认为这个概念映射得很好。

对我来说,说UserProfile.Update(用户名,密码,名字...)更有意义。你说的是“在UserProfile的抽象概念上对这个特定的数据集执行任务更新”。

请记住,我对抽象这个词的使用严格地是比喻性的,而不是在计算机科学的意义上。

1

没有太大的实际区别,但有点哲学差异。

我会在这里推荐单例方法 - 你确实描述了一种数据访问对象(DAO),尽管它处于高层次。

上的几点思考为什么:

  • 工厂式的方法来创建DBManager本身(即DBManagerFactory)会使得单元测试更容易;它适用于依赖注入模型。

  • 带有一堆静态方法的类通常被认为是没有重叠主题(即方法之间的独立性)的switchblade/utility类的类。想想像StringUtils这样的类 - 人们认为这个类没有普遍的状态。

  • 在粗俗的层面上,使用“所有静态方法”的方法,您为自己创造了许多工作,因为您需要为每种方法继续输入静态。再次,您可以只拥有一个DBManagerFactory,它只有一个用于创建DBManager的静态方法,它最终是一个单例。

相关问题