2016-11-19 3 views
2

Эй, так что я пытался понять шаблон Factory, когда следующий придумал:Factory Pattern - метод назначается объекту

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 или что-то еще ... может быть, кто-то может помочь!

+1

Программному объекту присваивается значение, возвращаемое функцией createOfficeProgram, которая создает объекты OfficeProgramm – dahui

+0

Чтобы расширить то, что сказал дахуи, 'OfficeProgramm program = createOfficeProgram (prog);' не присваивает _method_ "createOfficeProgram" переменной var скорее, он назначает _результат call_ 'createOfficeProgram (prog)', который действительно возвращает объект «OfficeProgramm», поэтому назначение OfficeProgramm в var типа OfficeProgramm не представляет проблемы. –

+0

, но если я правильно помню, абстрактные методы не могут быть вызваны. Вместо этого вызываются методы в подклассах. Что здесь называется? Нет classxy.createOfficeProgram(), это просто creatOffProgram() ... почему он вызывает метод в правильном классе? это не имеет никакого смысла для меня :( – Mreifenberger

ответ

0

Hallo Herr Reifenberger,

защищен не то же самое, как частные. Доступ к защищенному методу можно получить из классов пакета и подклассов. Как и в частных защищенных методах, можно получить доступ из собственного класса.

SoftwareShop - это абстрактный класс. Он просто определяет, какие подклассы методов будут реализовывать и не реализует сама функциональность. В примере кода MicrosoftOfficeFactory является реализация SoftwareShop, и этот MicrosoftOfficeFactory должен реализовать метод createOfficeProgram.

Вы можете проверить это путем добавления эфирных методов в абстрактный класс SoftwareShop или переименовать createOfficeProgram в MicrosoftOfficeFactory. Ваша IDE должна сообщить вам о том, что MicrosoftOfficeFactory должен реализовать createOfficeProgram SoftwareShop (и все другие методы, если они есть).

Вы должны дать код в реальном времени. ;) Попробуйте эту модифицированную версию 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 запускается.

+0

Да, я знаю это, спасибо :), но я не знаю, почему возможна программа (объект) = createOfficeProgram (метод в подклассе) – Mreifenberger

+0

@Mreifenberger btw Я думаю, что абстрактный класс является необязательным при использовании фабричный шаблон или полиморфизм. –

+0

Редактировать комментарий: я знаю, что тоже спасибо ... но я juts не понимаю, почему он вызывает метод в классе, реализующем функциональность ... обычно это похоже на instancexy.creatOfficeProgram() ... но здесь нет ни класса или экземпляр, который он просто вызывает метод, как делегат ... но метод находится в другом классе ... – Mreifenberger