all-static-methods和应用单例模式有什么区别?

我正在创建一个数据库来存储有关我网站用户的信息(我正在使用stuts2,因此使用Java EE技术)。 对于数据库,我将创建一个DBManager。 我应该在这里应用单例模式还是将所有方法设为静态?

我将使用此DBManager来添加,删除和更新用户配置文件等基本内容。 除此之外,我将用于所有其他查询目的,例如,查明用户名是否已经存在,并让所有用户出于管理目的和类似的东西。

我的问题

  • 单身模式有什么好处?
  • 哪个最适合这里? 所有静态方法还是单例模式?
  • 请比较它们。

问候

shahensha

PS数据库比这大。 这里我只讨论我将用于存储用户信息的表。

我应该在这里应用单例模式还是将其所有方法设为静态?

两者都不是。 只需创建一个 。

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

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

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

说UserProfile.Update(用户名,密码,firstName …)对我来说更有意义。 您说“在此特定数据集上执行UserProfile的抽象概念中的任务更新”。

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

没有太大的实际差异,但在某种程度上是一种哲学上的差异。

我会在这里推荐单例方法 – 你真的在描述一种类型的数据访问对象(DAO),虽然处于高水平。

关于原因的一些想法:

  • 创建DBManager本身(即DBManagerFactory)的工厂风格方法将使unit testing更容易; 它适用于dependency injection模型。

  • 具有一堆静态方法的类通常被假定为switchblade / utility类,没有过度主题(即方法之间的独立性)。 想想像StringUtils这样的类 – 人们认为这个类没有一般的状态。

  • 在粗略的层面上,使用“所有静态方法”方法,您需要为自己创建大量工作,因为您需要为每种方法保持静态输入。 同样,你可以拥有一个DBManagerFactory,它只有一个静态方法来创建DBManager,最终成为一个单例。