这个班级是单身吗?

shi*_*ang 6 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 7

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


Gee*_*nte 1

您可以将其设置为单例,但是您需要找到其他方法将模拟器注入其中。

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

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

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

如果单例之间存在依赖关系,我建议采用控制反转模式,其中 IoC 容器创建服务对象并将它们连接在一起。