我有一个具有构造函数的 Maze 类:
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
}
我在网上阅读有关良好做法的信息,现在我明白了复杂的构造函数是不好的做法。所以我认为工厂类是一个可行的解决方案。我想要做的是为迷宫生成一个随机种子、随机 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
}
}
将这种逻辑分离放入工厂类是否有益,或者这是错误的处理方式(错误的模式使用等),还是我应该在构造函数的 Maze 类中通过编写 private 来执行此操作方法并在构造函数中调用它们?我正在尝试了解不同的模式/最佳实践,但我认为我误解了工厂设计的处理方式,或者我是否只是使用了错误的模式。
最佳答案
您的问题是关于何时使用创建模式 https://en.wikipedia.org/wiki/Creational_pattern .这是一个相当复杂的大话题,没有正确和错误的答案。我将提供我个人的“经验法则”,但我相信会有很多相反的观点。
“工厂”模式的主要优点是它将对象的创建与其操作分开。触发因素之一是您事先不知道要创建哪个类。您可以拥有一个根据调用的方法生成许多不同类的工厂。请注意,这并不一定会使构造函数变得更简单。
“构建器”模式的主要优势在于它将复杂的构造器分解为用户可以更改的各个步骤。当创建有很多变化,或者当您有许多可以设置的潜在值具有合理的默认值时,此模式会有所帮助。
我想构建器更适合您的情况。您的构建代码可能类似于:
Maze myMaze = mazeBuilder.makeMazeOfSize(30, 20).withBoard(values).withSeed(15).build();
这也有利于记录创造值(value)的意义。
关于java - 处理构造函数逻辑的工厂类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34386761/