我目前正在完成一项课堂作业,其中一个问题希望我重建给我的一些示例代码。
在不太精确的情况下,他们有一个抽象类,有几个不同的子类,每个不同的子类别都被分配了一个武器,这取决于它是什么类型的子类别。
例如
if (this.getClass().getSimpleName().equals("FighterJet")) {
this.weapon = new GuidedMissileSystem();
System.out.println("FighterJet " + id + " equipped with " + weapon.getClass().getSimpleName());
}
else if (this.getClass().getSimpleName().equals("AttackHelicopter")) {
this.weapon = new GrenadeLauncher();
System.out.println("AttackHelicopter " + id + " equipped with " + weapon.getClass().getSimpleName());
...
然后,它向控制台打印一个字符串,其中包含子类和武器的名称。
在抽象超类中,它有一系列if语句来检查它是什么子类,并为它分配适当的武器和打印适当的字符串。
他们建议查看设计模式,我选择了"工厂方法",然而,由于它打印的是一个包含子类名称的字符串,我决定不在该方法中返回任何内容,只通过以下语法分配武器:
this.weapon = //whatever weapon
并返回空白。
这仍然被认为是工厂的方法吗?我怀疑不是。
谢谢!
你是对的,这不是一个工厂方法。工厂方法主要创建并返回类的新实例,可能会执行一些额外的初始化、日志记录或其他次要任务。
在您的示例中,不需要工厂,因为所有对象都有简单的构造函数。但如果你真的想写一个工厂方法,它通常看起来是这样的:
public static GuidedMissileSystem createGuidedMissileSystem() {
return new GuidedMissileSystem();
}
正如您所看到的,这对简单类没有任何好处。如果你必须配置武器的射程、弹药和许多其他细节,那会更有帮助。
看过你的代码后,我建议你将特定于子类的行为转移到它所属的地方——子类。例如,您可以向超类添加一个抽象方法createWeapon()
,并让子类选择适当的武器。