返回工厂方法模式的空隙

时间:2016-06-09 00:01:00

标签: java inheritance design-patterns factory-pattern

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

没有太精确,它们有一个带有几个不同子类的抽象类,每个不同的子类根据它的子类类型被赋予武器。

e.g。

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

并返回虚空。

这仍然被认为是工厂方法吗?我怀疑它不是。

谢谢!

1 个答案:

答案 0 :(得分:1)

你是对的,这不是工厂方法。工厂方法主要创建并返回类的新实例,可能会执行一些额外的初始化,日志记录或其他次要任务。

在您的示例中,不需要工厂,因为所有对象都具有简单的构造函数。但是如果你真的想写一个工厂方法,它通常会是这样的:

public static GuidedMissileSystem createGuidedMissileSystem() {
    return new GuidedMissileSystem();
}

如您所见,这对简单类没有任何好处。如果你必须配置武器的范围,弹药和许多其他细节,那将会更有帮助。

看一下你的代码,我建议你将特定于它所属的子类的行为移到子类。例如,您可以向您的超类添加抽象方法createWeapon(),并让子类选择适当的武器。