工厂模式 - 类型变量

时间:2015-09-05 21:04:04

标签: java enums factory-pattern

首先,我的英语不是最好的,我没有找到我想要的东西,也许是因为我不知道如何用英语或我的本土语言询问谷歌> java初学者!

我正在开发一个小游戏,其中我使用了许多类型的“炸弹”,为此我使用的是抽象类Bomb和枚举BombType。每种类型的炸弹都应该有自己的值,例如rangetimer。现在我正在努力解决我应该如何使用炸弹以及如何处理它们的类型的业务逻辑。是否更好地利用他们的type或他们的class

我有什么:

public enum BombType {

    // pass object or what else?
    DEFAULT(new Default()),
    NUKE(new Nuke());

    public final int range;
    public final long timer;

    BombType(Bomb paramBomb) {
        this.range = paramBomb.range;
        this.timer = paramBomb.timer;
    }
}

public abstract class Bomb {

    final BombType bombType;
    final int range;
    final long timer;

    protected Bomb(BombType paramBombType) {
        this.bombType = paramBombType;
        this.range = paramBombType.range;
        this.timer = paramBombType.timer;
    }

}

public class Default extends Bomb {
    protected Default() {
        super(BombType.DEFAULT);
    }
}

所以我的问题是我应该如何处理外部世界中不同类型的炸弹?

选项1,按类:

public void doSomethingWithTheBomb(Bomb bomb) {
    switch(bomb.bombType) {
        case DEFAULT: 
            Default defaultBomb = (Default) bomb;
            logger.log(defaultBomb.range);
            logger.log(defaultBomb.timer);
            {...}
            break;
        case NUKE: 
            Nuke nukeBomb = (Nuke) bomb;
            logger.log(nukeBomb.range);
            logger.log(nukeBomb.timer);
            {...}
            break;
        defrault:
            break;
    }
}

选项2,按类型:

public void doSomethingWithTheBomb(Bomb bomb) {
    logger.log(bomb.bombType.range);
    logger.log(bomb.bombType.timer);
    {...}
}

1 个答案:

答案 0 :(得分:3)

选项1不好,因为您重复了代码 选项2更好。

我会在抽象Bomb类中添加getRange()getTimer(),并根据需要执行的操作,使用doSomething()方法。这样你就可以让你的炸弹(无论哪个)做点什么。