【问题标题】:Factory Pattern - A method is assigned to the object工厂模式 - 将方法分配给对象
【发布时间】:2016-11-19 01:10:44
【问题描述】:

嘿,当出现以下情况时,我正试图理解工厂模式:

public abstract class SoftwareShop { 

public OfficeProgramm holeApp(String zuHolendesProg) { 
    //Delegation der Objekterstellung an Subklasse 
    OfficeProgramm programm = createOfficeProgram(zuHolendesProg); 

    //weitere verarbeitung 
    programm.einpacken(); 
    programm.etikettieren(); 

    return programm; 
} 

//Definition der Factory Method 
protected abstract OfficeProgramm createOfficeProgram(String zuHolendesProg); 

}           

class MicrosoftOfficeFactory extends SoftwareShop{ 
@Override 
protected OfficeProgramm createOfficeProgram(String zuHolendesProg) { 
    OfficeProgramm programm = null; 
    if (zuHolendesProg.equals("Textverarbeitung")) { 
        programm = new Word(); 
    } 
    else if (zuHolendesProg.equals("Präsentation")) { 
        programm = new Powerpoint(); 
    } 
    else if (zuHolendesProg.equals("Tabellenkalkulation")) { 
        programm = new Excel(); 
    } 
    else { 
        System.err.println("Ungültig!"); 
    } 
    return programm; 
} 
} 

对此我不明白的是:OfficeProgramm programm = createOfficeProgram(zuHolendesProg);

为什么可以将对象程序分配给方法 creatOfficeProgram(string param)?我对受保护的东西一无所知吗?还是因为它在 SoftwareShop 类中是抽象的?我根本不知道为什么这有效,而不是 object.createOfficeProgramm 或其他东西......也许有人可以帮忙!

【问题讨论】:

  • 程序对象被赋值为createOfficeProgram函数返回的值,该函数创建OfficeProgramm对象
  • 为了扩展大辉所说的,OfficeProgramm programm = createOfficeProgram(prog); 不是将 method "createOfficeProgram" 分配给名为 programm 的 var,而是分配调用的 结果 createOfficeProgram(prog) 确实返回了一个 OfficeProgramm 对象,因此将 OfficeProgramm 分配给 OfficeProgramm 类型的 var 没有问题。
  • 但如果我没记错的话,抽象方法不能被调用。而是调用子类中的方法。这里叫什么?没有 classxy.createOfficeProgram() 它只是 creatOffProgram() ......为什么它在正确的类中调用该方法?这对我来说毫无意义:(

标签: java factory


【解决方案1】:

你好赖芬伯格先生,

受保护与私有不同。可以从包的类和子类中访问受保护的方法。就像在私有保护方法中一样,当然可以从它自己的类内部访问。

SoftwareShop 是一个抽象类。它只是定义子类必须实现的方法,而不是实现功能本身。在示例代码中,MicrosoftOfficeFactory 是 SoftwareShop 的实现,而这个 MicrosoftOfficeFactory 必须实现 createOfficeProgram 方法。

您可以通过将方法添加到抽象类 SoftwareShop 或重命名 MicrosoftOfficeFactory 中的 createOfficeProgram 来检查这一点。您的 IDE 应该通知您 MicrosoftOfficeFactory 必须实现 SoftwareShop 的 createOfficeProgram(以及所有其他方法,如果存在)。

您必须让代码生效。 ;) 试试这个 MicrosoftOfficeFactory 的修改版本(我没有单词等类,所以我把它们注释掉了)。

package factory_pattern_a_method_is_assigned_to_the_object;


class MicrosoftOfficeFactory extends SoftwareShop{ 
@Override 

protected OfficeProgramm createOfficeProgram(String zuHolendesProg) { 
OfficeProgramm programm = null; 
if (zuHolendesProg.equals("Textverarbeitung")) { 
    //programm = new Word(); 
    System.out.println("Text w00t");
} 
else if (zuHolendesProg.equals("Präsentation")) { 
    //programm = new Powerpoint(); 
} 
else if (zuHolendesProg.equals("Tabellenkalkulation")) { 
    //programm = new Excel(); 
} 
else { 
    System.err.println("Ungültig!"); 
} 
return programm; 
}

public static void main(String[] nyannyan){
SoftwareShop newShop = new MicrosoftOfficeFactory();
newShop.holeApp("Textverarbeitung");
}
}

这会产生 文字w00t

因此 MicrosoftOfficeFactory 运行。

【讨论】:

  • 是的,我知道,谢谢 :) 但我不知道为什么 programm (object) = createOfficeProgram (子类中的方法) 是可能的
  • @Mreifenberger btw 我认为抽象类在使用工厂模式或多态时是可选的。
  • 编辑评论:我也知道谢谢...但我不明白为什么它会在实现功能的类中调用方法...通常它就像 instancexy.creatOfficeProgram() .. . 但这里既不是类也不是实例,它只是像委托一样调用方法......但该方法在不同的类中......
  • 实例化为SoftwareShop newShop = new MicrosoftOfficeFactory()。它在 SoftwareShop 中的编写方式就是描述抽象类的方式。抽象类本身并没有实例化,它们只是用于描述,尽管我必须承认它看起来很奇怪。 ;) docs.oracle.com/javase/tutorial/java/IandI/abstract.html
  • 感谢主,非常感谢您的帮助 :) 我明天再试一次,也许我太累了 :) 如果我明天还是不明白,我会在星期五问我的老师并发布如果有人有同样的问题,请在这里回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多