单例方法是否适合访问/维护数据库和Internet连接

时间:2013-03-24 14:17:00

标签: java design-patterns static singleton

所以,我正在开发一个需要本地数据库连接的应用程序,并使用一些Web服务来回发送和接收数据。

  • 每当我需要和数据库操作时,我就创建了一个对象 DbConnection class (这是我用来获取我的类的名称 数据库)并对其执行操作。

  • 同样,为了与互联网连接,我使用DefaultHttpClient和 创建一个相同的static对象,并在需要时创建 连接并调用 webservice 我创建HttpResponse对象 并获得响应数据。

1)我使用正确的方法或模式吗?

2)另外还有一点关注第2点,静态和单例的工作方式是否相同?

4 个答案:

答案 0 :(得分:4)

  

我使用正确的方法或模式吗?

我不这么认为。如果对连接使用单例(或静态),那么如果需要在可能需要多个连接的上下文中使用/重用代码,则会使其变得困难;例如如果您的应用程序是多线程的,或将其转换为库。

单身人士在可测试性方面也存在问题......

一般来说,你可以用单身人士(或静态)做任何事情,你也可以使用某种上下文参数。依赖注入(DI)框架提供了一种创建共享对象的简洁方法,并将它们“连接”到需要它们的其他对象中......而不使用单例或静态。或者,您可以通过各种方式手动完成。

  

静态和单例是否以相同的方式工作?

单身人士是一种设计模式。静态是Java语言功能,可用于实现Singleton模式。所以它们不是同一个东西(甚至是同样的类似的东西),但它们是相关的。

答案 1 :(得分:1)

没有单身人士总是坏人。除非你被迫使用它们,否则要避免使用它们(因为某些愚蠢的框架不会给你任何其他选择)

  • 他们没有意义,全局变量是什么意思?如果您有多个类加载器怎么办?如果你运行两次相同的程序怎么办?
  • 它们导致隐藏的时间耦合。单例A必须在单例B之前初始化,但不能在单例C或单例D之前初始化。大多数人甚至不知道如何在Java中控制单例的初始化时间。 (基本上你必须触摸一个静态字段才能确保它已经初始化,但是不要太快触摸它或者你会破坏它的顺序!)
  • 如果您处于安全环境(如安全管理员)或安全语言(如E)中,则会导致安全漏洞。
  • 很难让它们在多线程代码中运行。很难,世界上只有几千人知道如何在像Java这样的语言中“正确”地做到这一点,除非你只是编码模仿演员模型的东西,否则需要进行模块间分析才能做到正确。 java并发的目的
  • java语言规范的合着者(gilad bracha)甚至说单身人士很可怕,并且在没有他们的情况下制作了一种新语言(newspeak)

要么你传递一些物体,要么你面对上述问题加上我可能忘了提及。为什么2013年仍然存在这些平凡的问题超出了我的范围。

答案 2 :(得分:0)

哇。你的问题还有很多比你想象的要多,但是为了给你简短的答案,我见过的大多数项目(不使用ORM,你可能想要研究的东西)都会有一个包装的课程。围绕调用所有适当查询的DB对象,处理转义& c。它将实现一个公共接口,以便工厂类可以将其提供给期望匹配接口的东西。

至于Singleton / static,那真的取决于你的需要。在我上面提到的模式中,Singleton会更优越:它意味着访问数据库的每个对象都能够存储对db对象的本地引用。这也意味着您可以封装在父类中获取Singleton的过程。使用静态类将无法为您提供该选项。

答案 3 :(得分:0)

回答第1点 - 是单身是正确的做法。理想情况下,您必须只建立与数据库的单一连接。辛尔顿将帮助你实现这一目标。

对第2点的回答 - 没有静态不一定与单身人士一样。如果我们多次调用以单例模式创建对象,它将返回相同的对象。但是,如果多次调用create对象,则可以多次创建静态对象。

但是你可以确保静态对象只创建一次,然后与单例模式相同。