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");
}
}