Pytanie o wzorzec: "Fabryka abstrakcyjna"

0

Witam,
Zmieniam pytanie, bo na poprzednie nikt nie odpowiedział. Mianowicie, mamy taki wzorzec opisany tutaj: http://www.piotrosz.aspnet.pl/post/Wzorce-projektowe-Fabryka-abstrakcyjna.aspx.

Fabryka abstrakcyjna - interfejs ze zdefiniowanymi operacjami tworzenia dla każdego z abstrakcyjnych obiektów (IWidgetAbstractFactory),
Fabryki konkretne - implementacje interfejsu fabryki abstrakcyjnej (e.g. GtkFactory, FltkFactory),
Obiekty abstrakcyjne - interfejs dla rodzaju obiektu (e.g IButton, ICheckBox),
Obiekty konkretne - implementacja obiektu abstrakcyjnego (e.g. GtkButton, GtkCheckBox, FltkButton, FltkCheckBox),
Klient - używa tylko Fabryki abstrakcyjnej i obiektu abstrakcyjnych (w ogóle nie musi znać nazw konkretnych klas).

Pytanie moje brzmi:
Co w przypadku, gdy fabryka GtkFactory będzie miała obiekt "okrągły button", a FltkFactory nie?
Czy ten wzorzec działa TYLKO WTEDY, gdy dane fabryki mają dokładnie takie same obiekty?

Z góry dzięki za pomoc!

Zmieniłem cały temat, bo na tamten nikt nie odpowiadał, to nie potrzebne było go trzymać.

0

to ja odpowiem;p chociaż nie wiem czy o to pytasz...

to co widzi klient ograniczone jest do tego co jest zapisane w interfejsach,

jeżeli w interfejsie fabryki jest metoda, która zwraca interfejs `okrągły button', to wszystkie fabryki ją implementujące muszą coś takiego mieć, czyli obydwie biblioteki powinny coś takiego umożliwiać...

a jeżeli nie ma tego w interfejsie, to i tak klient tego nie użyje (chyba, że odwoła się do konkretnej klasy, co jest niezgodne ze wspomnianym wzorcem...)

0
now77ak napisał(a)

Co w przypadku, gdy fabryka GtkFactory będzie miała obiekt "okrągły button", a FltkFactory nie?
Czy ten wzorzec działa TYLKO WTEDY, gdy dane fabryki mają dokładnie takie same obiekty?

W takim przypadku robi sie tzw. najmniejszy wspolny mianownik - kazda konkretna fabryka implementuje tylko taki interfejs jaki kazda implementacja jest w stanie wspierac. Np. dawne java.awt i jej klasy okienkowe sa wlasnie tak zaimplementowane - one odpowiadaja tzw. peerom z danego OS, wiec jak jakis system nie ma tego peera, nie ma go w java.awt zaden. Dlatego np. nie bylo wsparcia dla traya, jakich cudow wiankow z dekoracja okien itp. Swing to zmienil bo tam kontrolki sa rysowane przez Jave.

Wzglednie, mozna zrobic interfejs bedacy iloczynem wszystkich mozliwych funcjonalnosci, idealnym mega wypasionym kombajnem. Konkretne implementacje, ktore nie maja danych mozliwosci musza to udokumentowac i rzucac np NotImplementedException gdy wywolane. Dodatkowo, interfejs powinien pozwalac odpytywac implementacje czy dana funkcjonalnosc jest dostepna:
IButton b;
if (guiFactory.hasRoundedButton()) {
b = guiFactory.createRounderButton();
} else {
// fallback - no rounded buttons, but we still want the app to work
b = guiFactory.getButton();
}
Zakladam tutaj ze getButton() dziala ;d

Wiele klas w Javie jest tak zaimplementowanych, np. strumienie (InputStream.markSupported() i mark(), java.util.Iterator.remove() rzuca UnsupportedOperatioException gdy implementacja nie wspiera, polowa metod java.util.Collection rzuca ten sam wyjatek). Ogolnie uwaza sie ze jest to slaby design.

0

Albo zaokrąglenie udostępnić jako właściwość i w razie nieobsługiwania przez daną implementację - nie uwzględniać jej (dostarczyć najbliższą możliwą implementację). Najprościej:

IButton button = guiFactory.createButton(IGuiFactory.ROUNDED); // jeśli nie ma zaokrąglonego, stwórz prostokątny

1 użytkowników online, w tym zalogowanych: 0, gości: 1