工厂方法构建Java对象:属性与构造函数(通过方法)

时间:2018-02-26 10:56:21

标签: java constructor factory

我有一个类(A),它通过工厂方法(2)使用(1)另一个类(B):

(A)
public class MazeGame{
  private Room room;  // (1)

  public MazeGame() {
    this.room= makeRoom();   // (2)
  }

  protected Room makeRoom() {
    return new OrdinaryRoom();
  }
}

例如:

(B)
public class OrdinaryRoom{
  private String name = "ordinaryRoom";
}

我也可以写(A):

(A2)
public class MazeGame{
  private Room room = makeRoom();  // (1)(2)

  protected Room makeRoom(){
    return new OrdinaryRoom();
  }
}

(A)和(A2)之间有什么区别? 使用一个而不是另一个有一些优势吗?

1 个答案:

答案 0 :(得分:0)

我看到的差异:

  • 初始化时刻的微小差异 room:使用(A),在完成超级构造函数Object()调用后初始化{ {1}}构造函数。使用(A2)初始化在完成超级构造函数MazeGame()调用之后和任何Object()构造函数的第一行之前进行。在你的情况下,它没有什么区别。
  • (A2)的初始化适用于MazeGame(...)将拥有的所有构造函数,而(A)方法仅初始化此MazeGame { {1}}构造函数,不影响您将来可能添加的任何构造函数。
  • 将初始化移至room字段"允许"您要从源代码中删除构造函数,并在没有构造函数的情况下依赖编译器生成的默认构造函数。我不认为这是一种好处,但是作为维护风险,因为如果将来你想添加一些例如MazeGame()构造函数,这不仅添加了新的构造函数(预期的结果),而且还删除了默认的构造函数 - 可能非常意外。