这个班级是单身吗?

时间:2016-11-30 08:52:12

标签: java design-patterns

下面列出的班级是单身人士吗?由于构造函数被声明为public,我可以推断该类是一个错误实现的单例吗?

public class CreateDevice extends Functionality{

  private static Simulator simulator;
  ConnectionDB connect = ConnectionDB.getInstance();


  public CreateDevice(Simulator simulator){
    this.simulator = simulator;
  }

  private static CreateDevice instance;
  synchronized public static CreateDevice getInstance() {
    if(instance == null){
      instance = new CreateDevice(simulator);
    }       
      return instance;
  }
}

3 个答案:

答案 0 :(得分:7)

总之 - 没有。由于构造函数是public,任何人都可以随时随地创建它的新实例。使构造函数private应该解决问题,并将类转换为单例。

答案 1 :(得分:2)

我会说你说这在当前的实现中不是Singleton是正确的。

您需要将构造函数设置为私有(通常是这样做),或者如果由于遗留原因需要公共构造函数,则应创建一个构造函数来检查实例是否为null,如果实例为null,则抛出异常它已经存在或通过调用另一个私有构造函数创建它,将其分配给实例,然后返回它。第一种选择是可取的,但是对于大多数重构过于昂贵的项目而言,其他选项都可行。

答案 2 :(得分:1)

你可以把它变成单身,但是你需要找到另一种方法将模拟器注入其中。

在当前实现中,模拟器是在第一次有人调用构造函数时设置的。该构造函数非常奇怪,因为它设置了一个静态字段。它还将立即打开一个连接,与单例实例使用的连接分开。

如果在构造函数被调用至少一次之前调用了getInstance()方法,则永远不会设置模拟器。

要使其成为正确的单例,您可以删除构造函数并添加私有的无参数构造函数。您还需要一个静态setSimulator()方法来设置静态字段,并确保在需要与模拟器进行任何其他交互之前调用它。

如果您在单例之间存在依赖关系,我建议您使用Inversion-of-Control模式,其中IoC容器创建服务对象并将它们连接在一起。