我正在开发一款有几种不同类型砖块的网页游戏,所以我决定实施工厂模式。砖块存储在数据库中(必须具有),然后使用工厂使用结果集中的属性进行构建。
厂:
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;)工作正常,但是为每个砖查询数据库需要太长时间
答案 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)值对,但它们代表不同的东西,交换它们不会产生预期的结果。