Wpis z mikrobloga

@crasti: > Czy wzorzec projektowy abstrakcyjnej fabryki łamie zasadę open/close principle?

@crasti: Brzmi jak zadanie domowe z informatyki.

Przykładowo:
public class AbstractFactoryApp {

/**
*
*/
public AbstractFactoryApp() {
// TODO Auto-generated constructor stub
}

public static GUIFactory getGUIFactory(String os) throws Exception{
try{
OperatingSystems.valueOf(os);
}catch (IllegalArgumentException e) {
throw new Exception("The OS "+os+" is not supported");
}
GUIFactory factory = null;
if(os.equalsIgnoreCase(OperatingSystems.WINDOWS.name())){
factory = new WindowsGUIFactory();
}else if(os.equalsIgnoreCase(OperatingSystems.MAC.name())){
factory =
@63274682374: ale sama w sobie fabryka, jeśli chcemy dodać nowy system i tak musimy edytować kod fabryki. Więc może wspomaga (bo edytuje w jednym miejscu), ale tak czy siak łamie, bo muszę zmodyfikować metodę wytwórczą (getGUIFactory())
@Suchar_Strasburgera: W javie za pomocą refleksji też da się to tak zrobić. Pytanie tylko czy to nadal będzie AbstractFactory. W miejscu wywołania getGUIFactory() wskazujemy konkretną implementację przez co tracimy jeden poziom abstrakcji i chyba sensowność takiego rozwiązania.

Poza skomplikowanym i wolniejszym kodem dodatkowym minusem jest konwencja nazewnicza, której trzeba się trzymać przy rozbudowie systemu.
@Suchar_Strasburgera: > wystarczy przekazać string "Foo" i metoda na podstawie stringa tworzy fabrykę Foo.

@Suchar_Strasburgera: Przepraszam, z cytowanego tekstu założyłem, że "Foo" to nazwa konkretnej klasy i w tym kontekście napisałem odnośnie wskazywania konkretnej implementacji.

Co do twojego przykładu, to nawet refleksja nie jest potrzebna bo klasy są rejestrowane w fabryce przy użyciu statycznej metody.