Java Factory模式-为对象指定了一种方法
嘿,当我试图理解工厂模式时,出现了以下情况:Java Factory模式-为对象指定了一种方法,java,factory,Java,Factory,嘿,当我试图理解工厂模式时,出现了以下情况: public abstract class SoftwareShop { public OfficeProgramm holeApp(String zuHolendesProg) { //Delegation der Objekterstellung an Subklasse OfficeProgramm programm = createOfficeProgram(zuHolendesProg); //weite
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;
}
}
关于这一点,我不了解的是:officeprogram program=createOfficeProgram(zuHolendesProg)代码>
为什么可以将对象程序分配给方法createOfficeProgramm(字符串参数)?我对保护的东西一无所知吗?还是因为它在SoftwareShop类中是抽象的?我完全不知道为什么这是有效的,而不是object.createOfficeProgramm或其他什么。。。也许有人能帮忙 你好,雷芬伯格先生
受保护与私有不同。可以从包的类和子类访问受保护的方法。正如在私有保护中一样,当然可以从它自己的类内部访问方法
SoftwareShop是一个抽象类。它只定义子klass必须实现哪些方法,而不实现功能本身。在示例代码中,MicrosoftOfficeFactory是SoftwareShop的实现,该MicrosoftOfficeFactory必须实现CreateOfficeProgramm方法
您可以通过向抽象类SoftwareShop添加方法或在MicrosoftOfficeFactory中重命名createOfficeProgram来检查这一点。您的IDE应该通知您MicrosoftOfficeFactory必须实现SoftwareShop的createOfficeProgram(以及所有其他方法,如果有的话)
你必须让代码生效
试试MicrosoftOfficeFactory的这个修改版本(我没有word等类,所以我把它们注释掉了)
这就产生了
文本w00t
因此,MicrosoftOfficeFactory运行。程序对象被分配从CreateOfficeProgramm函数返回的值,该函数创建OfficeProgramm对象以扩展dahui所说的,OfficeProgramm programm=CreateOfficeProgramm(prog)
并不是将方法“CreateOfficeProgramm”分配给名为program的变量,而是分配调用CreateOfficeProgramm(prog)
的结果,它确实返回一个OfficeProgramm
对象,所以将OfficeProgramm分配给OfficeProgramm类型的变量是没有问题的,不能调用抽象方法。而是调用子类中的方法。这里叫什么?没有classxy.createOfficeProgram(),它只是CreateOffProgram()。。。为什么它调用正确类中的方法?这对我来说毫无意义:(是的,我知道,谢谢:)但我不知道为什么program(object)=createOfficeProgramm(子类中的方法)是possible@Mreifenberger顺便说一句,我认为在使用工厂模式或多态性时,抽象类是可选的。。。但是我不明白为什么它在实现功能的类中调用方法。。。通常它类似于instancexy.createOfficeProgramm()。。。但这里既不是类也不是实例,它只是像委托一样调用方法。。。但是该方法在另一个类中…实例化将是SoftwareShop newShop=new MicrosoftOfficeFactory()
。它在SoftwareShop中的编写方式就是抽象类的描述方式。抽象类本身并没有实例化,它们只是用于描述,尽管我必须承认这看起来很奇怪感谢上帝,我真的很感谢你的帮助:)我明天会再试一次,也许我太累了:)如果我明天还没拿到,我会在周五问我的老师,如果有人有同样的问题,我会把答案贴在这里:)
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");
}
}