服务类应该是java中的单例吗?

时间:2011-12-29 16:04:37

标签: java design-patterns

在设计服务类时,它应该是java中的单例吗?一般来说DAO是单例的,所以调用Service类也应该是单例吗?

3 个答案:

答案 0 :(得分:7)

恕我直言,服务不应该保持状态,因此应该成为单身人士。

答案 1 :(得分:1)

单身者是坏的,如果你发展它们。如果使用依赖项注入,请让DI容器处理Service对象的单例性质。如果您不使用依赖注入,请使用静态方法而不是单例。

坏的典型例子:

public class HootUtility // singleton because developer was a goofball.
{
   ...
   public void blammy(...) { ... }
   public HootUtility getInstance() { ... }
}

... somewhere in the code.

HootUtility.getInstance().blammy(...);  // This is silly.

更好地实施上述目标:

public class HootUtility // Not a singleton because I am not a ______. (fill in the blank as you see fit)
{
  // You can limit instantiation but never prevent instantiation.
  // google "java reflection" for details.
  private HootUtility()
  {
    throw new UnsuppotedOperationException();
  }

  public static void blammy(...) { ... }
}

... somewhere in the code.

HootUtility.blammy(...);

如果你有一个具有具体实现的服务接口,请使用依赖注入框架来注入实现(DI框架包括:spring和guice)。

编辑:如果我使用的是spring,我会选择singleton范围(默认值)。

答案 2 :(得分:0)

实际上我相信你在设计时不应该关心它。像 @DwB 提到的 DI 框架应该做这个工作。此外,我相信没有范围(“prototype”)应该是默认的,如果有人自己创建它,我看不出任何不好的东西。 此外,这个问题可以通过模块化和分离服务接口和实现来简化,就像所说的最佳实践一样。