Java 工厂模式类型变量

Java 工厂模式类型变量,java,enums,factory-pattern,Java,Enums,Factory Pattern,首先,我的英语不是最好的,我还没有找到我想要的,可能是因为我不知道如何用英语问谷歌或者我的nativ language>java初学者 我正在开发一个小游戏,其中我使用了多种类型的“炸弹”,为此我使用了一个抽象类Bomb和一个enumBombType。每种类型的炸弹都应该有自己的值,例如范围和定时器。现在,我正在和商业逻辑作斗争,我应该如何使用炸弹,我应该如何处理它们的类型。使用他们的类型还是使用他们的类 我所拥有的: public enum BombType { // pass ob

首先,我的英语不是最好的,我还没有找到我想要的,可能是因为我不知道如何用英语问谷歌或者我的nativ language>java初学者

我正在开发一个小游戏,其中我使用了多种类型的“炸弹”,为此我使用了一个抽象类
Bomb
和一个enum
BombType
。每种类型的炸弹都应该有自己的值,例如
范围
定时器
。现在,我正在和商业逻辑作斗争,我应该如何使用炸弹,我应该如何处理它们的类型。使用他们的
类型
还是使用他们的

我所拥有的:

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;
    }
}
public void doSomethingWithTheBomb(Bomb bomb) {
    logger.log(bomb.bombType.range);
    logger.log(bomb.bombType.timer);
    {...}
}
选项2,按类型:

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;
    }
}
public void doSomethingWithTheBomb(Bomb bomb) {
    logger.log(bomb.bombType.range);
    logger.log(bomb.bombType.timer);
    {...}
}

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


我将向抽象Bomb类添加一个
getRange()
getTimer()
,并根据需要执行的操作,添加一个
doSomething()
方法。这样你就可以让你的炸弹(无论它是什么)做点什么。

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


我将向抽象Bomb类添加一个
getRange()
getTimer()
,并根据需要执行的操作,添加一个
doSomething()
方法。这样你就可以让你的炸弹(无论它是什么)做点什么。

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


我将向抽象Bomb类添加一个
getRange()
getTimer()
,并根据需要执行的操作,添加一个
doSomething()
方法。这样你就可以让你的炸弹(无论它是什么)做点什么。

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



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

所以枚举
BombType
不需要知道炸弹类型的特定范围或计时器的正确性。在Bomb类中可以有一个构造函数,它将范围和计时器作为参数。那么有没有比将>5个参数传递给构造函数更好的方法呢?像传递类或其他什么,访问类的值
范围
计时器
?这是一个太宽泛的问题,也是基于观点的。我不介意一个有很多参数的构造函数,但更喜欢最多有2个参数的方法。有一些模式可以初始化对象,而不必在构造函数IIRC中使用它们。好吧,那么我必须阅读并练习更多!非常感谢你!因此,enum
BombType
不需要知道特定于炸弹类型的范围或计时器长度?正确。在Bomb类中可以有一个构造函数,它将范围和计时器作为参数。那么有没有比将>5个参数传递给构造函数更好的方法呢?像传递类或其他什么,访问类的值
范围
计时器
?这是一个太宽泛的问题,也是基于观点的。我不介意一个有很多参数的构造函数,但更喜欢最多有2个参数的方法。有一些模式可以初始化对象,而不必在构造函数IIRC中使用它们。好吧,那么我必须阅读并练习更多!非常感谢你!因此,enum
BombType
不需要知道特定于炸弹类型的范围或计时器长度?正确。在Bomb类中可以有一个构造函数,它将范围和计时器作为参数。那么有没有比将>5个参数传递给构造函数更好的方法呢?像传递类或其他什么,访问类的值
范围
计时器
?这是一个太宽泛的问题,也是基于观点的。我不介意一个有很多参数的构造函数,但更喜欢最多有2个参数的方法。有一些模式可以初始化对象,而不必在构造函数IIRC中使用它们。好吧,那么我必须阅读并练习更多!非常感谢你!因此,enum
BombType
不需要知道特定于炸弹类型的范围或计时器长度?正确。在Bomb类中可以有一个构造函数,它将范围和计时器作为参数。那么有没有比将>5个参数传递给构造函数更好的方法呢?像传递类或其他什么,访问类的值
范围
计时器
?这是一个太宽泛的问题,也是基于观点的。我不介意一个有很多参数的构造函数,但更喜欢最多有2个参数的方法。有一些模式可以初始化对象,而不必在构造函数IIRC中使用它们。好吧,那么我必须阅读并练习更多!非常感谢你!