Wzorzec Abstract Factory jest bardzo bliskim krewnym wzroca Factory Method. Oba wzroce należą do grupy wzorców konstrukcyjnych – jedyna różnica między nimi jest taka, że Factory method tworzy jeden obiekt, a abstract factory całą grupę powiązanyc obiektów. W opisie wzorca factory method tworzyliśmy Napoje : Wino, Piwo, Kawa lub Woda. Nie było zdefiniowane więcej szczegółów. Jednakże w naszej alikacji potrzbujemy czegoś więcej. Każdy napój powinien byc podany w odpowiednim naczyniu (Kufel, Kieliszek, Kubek lub Szklanka) oraz z odpowiednim dodatkiem ( Ser do Wina, Sernik do Kawy, Orzeszki do Piwa). W takiej sytuacji najlepiej wykorzystać wzorzec abstract factory. Tworzymy interfejsy Dodatek oraz Szkło i klasy implementujące te interfejsy do wykorzystania w naszej fabryce.
Następnie abstrakcyjną klasę bazową w której umieścimy ogólne metody naszej implementacji. Oraz utworzymy klasę pochodną w której umieścimy wszystkie szczegóły tworzenie grupy obiektu.
Klasa abstrakcyjna:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public abstract class Przekaska { protected abstract Napoje createNapoj(); protected abstract Dodatek createDodatek(); protected abstract Szklo createSzklo(); public void przygotujPrzekaske() { //.. coś tam coś tam Napoje napoj = createNapoj(); Dodatek dodatek = createDodatek(); Szklo szklo = createSzklo(); } } |
Potomna klasa konstrukcyjna:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class DeserKawowy extends Przekaska{ protected Napoje createNapoj() { return new Kawa(); } protected Dodatek createDodatek() { return new Ser(); } protected Szklo createSzklo() { return new Kielich(); } } |
Podobnie jak w factory method, context programu może przygotować operacje nie znając który obiekt dostanie. Dodanie nowego produktu to dodanie nowej klasy do naszej aplikacji.
Diagram wzorca: