为Factory方法模式返回Void



我目前正在完成一项课堂作业,其中一个问题希望我重建给我的一些示例代码。

在不太精确的情况下,他们有一个抽象类,有几个不同的子类,每个不同的子类别都被分配了一个武器,这取决于它是什么类型的子类别。

例如

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(),并让子类选择适当的武器。