【问题标题】:Returning Void For A Factory Method Pattern为工厂方法模式返回 Void
【发布时间】:2016-10-09 10:48:58
【问题描述】:

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

不太精确,它们有一个带有几个不同子类的抽象类,每个不同的子类根据它是哪种子类分配一个武器。

例如

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

并返回 void。

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

谢谢!

【问题讨论】:

  • 一般性说明:更喜欢this instanceof FighterJetgetClass().equals(FighterJet.class) 而不是字符串比较——它更精确,更简洁。

标签: java inheritance design-patterns factory-pattern


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多