工厂模式 - 在SQL存储库中构建并在之后构建?

时间:2017-11-28 08:47:13

标签: java design-patterns

我正在开发一款有几种不同类型砖块的网页游戏,所以我决定实施工厂模式。砖块存储在数据库中(必须具有),然后使用工厂使用结果集中的属性进行构建。

厂:

public class BrickBuilder {

public Brick build(String type, int width, int height, String image) {
    Brick brick = null;

    switch (type) {
        case "energy":
            brick = new EnergyBrick(width, height, image);
            break;
        ...

    return brick;
}

家长班:

public abstract class Brick {

// Properties

public Brick(String type, int width, int height, String image){
    this.type = type;
    this.width = width;
    this.height = height;
    this.image = image;
}

public abstract void construct(double x, double y, int hitCount);

具体实施:

public class EnergyBrick extends Brick {

// Properties

public EnergyBrick(int width, int height, String image) {
    super("energy", width, height, image);
}

@Override
public void construct(int hitCount, double x, double y) {
    this.hitCount = hitCount;
    this.x = x;
    this.y = y;
}

存储库中的getAll,getByName,...使用的SQL ResultSet to Brick

private Brick rsToBrick(ResultSet rs) throws SQLException {
    String type = rs.getString("name");
    int width = rs.getInt("width");
    int height = rs.getInt("height");
    String image = rs.getString("image");

    Brick brick = BUILDER.build(type, width, height, image);

    return brick;
}

生成砖块

private void generateBricks() {
    List<Brick> databaseBricks = BrickRepositorySQL.getInstance().getAll();
    bricks = new ArrayList<>();

    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 14; j++) {
            chance = Math.floor(Math.random() * 5);
            if (chance == 4) {
                continue;
            }
            if (chance == 3 || chance == 2 || chance == 1) {
                // Create new concrete brick with tesame properties as in the array 
                x = j * 140;
                y = i * 80;
                brick.construct(x, y, 1);
                if (chance == 0) {
                    x = j * 140;
                    y = i * 80;
                    // Create new concrete brick with tesame properties as in the array 
                    brick.construct(x, y, 1);
                }
                bricks.add(brick);
            }
        }
    }
}

我有一个ArrayList,它包含数据库中所有不同类型的砖块。我想从这个数组中取出一块砖,例如EnergyBrick,然后用相同的属性创建一个新的EnergyBrick,并使用此砖上的构造方法用hitCount设置x和y坐标。

我尝试过的事情:

databaseBricks.get(brickIndex)然后在这块砖上使用构造方法,问题是所有砖块都有相同的参考

repository.getByName(&#34; energy&#34;)工作正常,但是为每个砖查询数据库需要太长时间

1 个答案:

答案 0 :(得分:3)

您构建的数据库包含所有必需的数据,但尚未构建它以支持您的查询模式。

如果查询特定的砖块,则应该在包含唯一砖块的字段上有索引。

  

然后创建一个具有相同属性的新EnergyBrick并使用   在这个砖上构造方法来设置x和y坐标   hitCount。

所以,请使用你的工厂。您创建它以使新砖的构造更容易。使用它!

Brick brick = getBrickToBeCopied();
Brick newBrick = BrickBuilder.build(brick.getName(), brick.getWidth(), brick.getHeight(), brick.getImage());
database.store(newBrick);

或宽度和高度是否改变

Brick brick = getBrickToBeCopied();
Brick newBrick = BrickBuilder.build(brick.getName(), newWidth, newHeight, brick.getImage());
database.store(newBrick);

我看到的一件事是令人困惑的事情,似乎X和Y的位置因宽度和高度而混淆。如果数据库正在存储位置,则将其添加到Brick对象并将其保留在数据库中。虽然位置和维度都有(x,y)值对,但它们代表不同的东西,交换它们不会产生预期的结果。