Java 工厂模式类型变量
首先,我的英语不是最好的,我还没有找到我想要的,可能是因为我不知道如何用英语问谷歌或者我的nativ language>java初学者 我正在开发一个小游戏,其中我使用了多种类型的“炸弹”,为此我使用了一个抽象类Java 工厂模式类型变量,java,enums,factory-pattern,Java,Enums,Factory Pattern,首先,我的英语不是最好的,我还没有找到我想要的,可能是因为我不知道如何用英语问谷歌或者我的nativ language>java初学者 我正在开发一个小游戏,其中我使用了多种类型的“炸弹”,为此我使用了一个抽象类Bomb和一个enumBombType。每种类型的炸弹都应该有自己的值,例如范围和定时器。现在,我正在和商业逻辑作斗争,我应该如何使用炸弹,我应该如何处理它们的类型。使用他们的类型还是使用他们的类 我所拥有的: public enum BombType { // pass ob
Bomb
和一个enumBombType
。每种类型的炸弹都应该有自己的值,例如范围
和定时器
。现在,我正在和商业逻辑作斗争,我应该如何使用炸弹,我应该如何处理它们的类型。使用他们的类型
还是使用他们的类
我所拥有的:
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中使用它们。好吧,那么我必须阅读并练习更多!非常感谢你!因此,enumBombType
不需要知道特定于炸弹类型的范围或计时器长度?正确。在Bomb类中可以有一个构造函数,它将范围和计时器作为参数。那么有没有比将>5个参数传递给构造函数更好的方法呢?像传递类或其他什么,访问类的值范围和计时器?这是一个太宽泛的问题,也是基于观点的。我不介意一个有很多参数的构造函数,但更喜欢最多有2个参数的方法。有一些模式可以初始化对象,而不必在构造函数IIRC中使用它们。好吧,那么我必须阅读并练习更多!非常感谢你!因此,enumBombType
不需要知道特定于炸弹类型的范围或计时器长度?正确。在Bomb类中可以有一个构造函数,它将范围和计时器作为参数。那么有没有比将>5个参数传递给构造函数更好的方法呢?像传递类或其他什么,访问类的值范围和计时器?这是一个太宽泛的问题,也是基于观点的。我不介意一个有很多参数的构造函数,但更喜欢最多有2个参数的方法。有一些模式可以初始化对象,而不必在构造函数IIRC中使用它们。好吧,那么我必须阅读并练习更多!非常感谢你!因此,enumBombType
不需要知道特定于炸弹类型的范围或计时器长度?正确。在Bomb类中可以有一个构造函数,它将范围和计时器作为参数。那么有没有比将>5个参数传递给构造函数更好的方法呢?像传递类或其他什么,访问类的值范围和计时器?这是一个太宽泛的问题,也是基于观点的。我不介意一个有很多参数的构造函数,但更喜欢最多有2个参数的方法。有一些模式可以初始化对象,而不必在构造函数IIRC中使用它们。好吧,那么我必须阅读并练习更多!非常感谢你!