Witam,
Uczę się poprawnie stosować wzorce. Największym na razie problemem jest dla mnie zidentyfikowanie jaki wzorzec odpowiada dokładnie mojej sytuacji...
Mam taki przykład "ćwiczebny"
- potrzebuję stworzyć mechanizm, który będzie zwracał mi obiekt pracownika dla podanych kryteriów wyszukiwania (w bazie danych).
- Obiekt ten będzie wykorzystywany zawsze w taki sam sposób.
- Kryteria wyszukiwania mają bezpośredni wpływ na sposób szukania (rodzaj zapytania) pracownika w bazie danych
- Nie interesuje mnie w jaki sposób znaleziono pracownika, mam dostać albo obiekt albo informacje, ze nie można znaleźć np. w postaci wyjątku
- Mechanizm powinien zapewniać buforowanie / cacheowanie aby pobieranie kilka razy tego samego pracownika nie powodowało niepotrzebnych zapytań do bazy
Dla takich wymagań próbowałem wymyślić sposób na "poprawne" zaimplementowanie tego.
Wymyśliłem że:
zrobię interfejs pracownika:
public interface IPracownik {
int iD();
String name();
Date bornDate();
// itd.
}
Stworzę jakąś klasę abstrakcyjną, która implementuje ten interfejs
public abstract class AbsPracownik implements IPracownik {
}
Następnie stworzę klasy dziedziczące z AbsPracownik, które będą "wiedziały" jak się stworzyć na podstawie konkretnego kryterium wyszukiwania:
public class PracownikZPesel extends AbsPracownik {
public PracownikZPesel( Pesel ){};
}
public class PracownikZNip extends AbsPracownik {
public PracownikZNip( Nip ) {};
}
public class PracownikZDowod extends AbsPracownik {
public PracownikZDowod( NrDowodu ) {};
}
Żeby zapewnic buforowanie i gdzies decydowac o tym jaki obiekt utworzyc musze miec jeszcze jedną klasę
public class Pracownicy {
public Pracownicy() {};
public IPracownik znajdzPracownika( CKryteria Kryterium ) {
AbsPracownik Pracownik;
//najpierw musze jeszcze przeszukac bufor. jesli znajde czlowieka to go zwracam.
switch (Kryterium.Typ) {
case "Pesel": Pracownik = new PracownikZPesel(Kryterium.Pesel);
case "Nip": Pracownik = new PracownikZNip(Kryterium.Nip);
case ...:
}
...
return Pracownik;
}
}
Czy to co wymyśliłem ma jakikolwiek sens?
Czy dobrze próbuję zaimplementować wzorzec Factory Method?
Zastanawiam się jaka w tym konkretnym przypadku byłaby różnica gdybym zamiast factory użył wzorca Template Method.
Czy buforowanie mogę zaimplementować po prostu jako tablicę obiektów, którą będę przeszukiwał?
Dziękuję z góry za pomoc.
pozdrawiam
mrlestat