工厂 class 来处理构造函数的逻辑?

Factory class to handle logic of a constructor?

我有一个迷宫class,它有一个构造函数:

public class Maze implements MazeInterface {

  private int width;          // Width of maze in units
  private int height;         // Height of maze in units
  private long seed;          // Seed generated for the maze
  private Cell[][] board;     // 2D representation of the maze

  public Maze(int w, int h, Cell[][] maze, long s){
      width = w;
      height = h;
      board = maze;
      seed = s;
  }

  // Bunch of other methods/stuff irrelevant

}

我在网上阅读有关良好做法的信息,现在我明白了复杂的构造函数是不好的做法。所以我认为工厂 class 是一个可行的解决方案。我想要做的是为迷宫生成一个随机种子、随机 w/h 值(迷宫有多少个单位宽或高),以及 Maze 对象的其他逻辑。工厂模式是正确的做法吗?

public class MazeFactory {

  public Maze createMaze(){
      long s = generateSeed();       // Generation of a seed
      int w  = generateW();          // Random w value
      int h  = generateH();          // Random h value

      return new Maze(w, h, new Cell[w][h], s);
  }

  private long generateSeed(){
      // Do stuff and return a seed
  }

  private int generateW(){
      // Do stuff
  }

  private int generateH(){
      // Do stuff
  }

}

将逻辑分离放入工厂是否有益 class 或者这是错误的方法(错误的模式 use/etc)还是我应该在通过编写私有方法并在构造函数中调用它们来在构造函数中迷宫 class?我正在尝试了解不同的 patterns/best 实践,但我认为我误解了工厂设计的处理方式,或者我只是使用了错误的模式。

您的问题是关于何时使用创建模式https://en.wikipedia.org/wiki/Creational_pattern。这是一个相当复杂的大话题,没有正确和错误的答案。我会提供我个人的 'rules-of-thumb' 但我相信会有很多相反的观点。

'factory' 模式的主要优势在于它将对象的创建与其操作分开。触发因素之一是您事先不知道要创建哪个 class。您可以拥有一个工厂,根据调用的方法生成许多不同的 classes。请注意,这并不一定会使构造函数变得更简单。

'builder' 模式的主要优势在于它将复杂的构造函数分解为用户可以更改的各个步骤。当创建有很多变化时,或者当您有许多可以设置的潜在值具有合理的默认值时,此模式会有所帮助。

我猜建筑商更适合您的情况。您的构造代码可能类似于:

Maze myMaze = mazeBuilder.makeMazeOfSize(30, 20).withBoard(values).withSeed(15).build();

这也有利于记录创建值的含义。