Stronę tą wyświetlono już: 5033 razy
Opis wzorca
Wzorzec budowniczy (ang. builder) należy do grupy wzorców kreacyjnych. Jego zadaniem jest za pomocą interfejsu budowniczego i klasy dyrektora budowanie konkretnych typów obiektów. Dyrektor dysponuje wskaźnikiem na interfejs budowniczego, za którym stoi klasa budowniczego konkretnego typu obiektu. Wskaźnik ten jest ustawiany za pomocą metody setBuilder, która przyjmuje jako jedyny argument wskaźnik na interfejs budowniczego.
Model ten można zastosować w grze komputerowej albowiem łatwo sobie wyobrazić np. budynek, którego celem jest wytwarzanie konkretnych obiektów, na które składają się obiekty składowe. Takim budynkiem może być np. fabryka różnego typu czołgów, ludzi, samolotów czy też innych obiektów często spotykanych w grach strategicznych. Użytkownik sobie wybiera obiekty, które mają zostać wyprodukowane a te w postaci wskaźników na interfejsy konkretnych budowniczych są odkładane na stertę. Z sterty kolejno zdejmowane są interfejsy i po wykonaniu danego obiektu pobierany jest kolejny wskaźnik na interfejs budowniczego aż na stosie nie będzie już interfejsów do obsłużenia (wykonane zostały już wszystkie obiekty z zamówienia idącego od użytkownika).
Przykład diagramu UML wzorca projektowego budowniczy
Sercem wzorca budowniczego z poniższego diagramu UML jest interfejs iBuilderTank oraz klasy:
- Tank zawierająca opis obiektu budowanego;
- BuilderTankA1M1_Abrams udostępniająca metody budowy konkretnego modelu czołgu (w tym przypadku amerykańskiego czołgu z pancerzez z zubożonego uranu A1M1 Abrams);
- BuilderTankT34 udostępniająca metody budowy konkretnego modelu czołgu (w tym przypadku rosyjskiego czołgu T34)
Jak widać na poniższym diagramie klasa Tank agreguje obiekty klas:
- Armor - opisującej opancerzenie czołgu;
- Cannon - opisującej działo czołgu;
- Chassis - opisującej podwozie czołgu;
- FuelTank - opisującej zbiornik paliwa czołgu;
- Engine - opisującej silnik czołgu
Jak widać interfejs iBuilderTank jest agregowany przez klasę nadzorcy (dyrektora) TankDirector, do której za pośrednictwem metody setBuilder wskaźnik na tenże interfejs jest przekazywany. Metoda createTank przygotowuje czołg budując poszczególne jego elementy i składając go do kupy. Po wybudowaniu można wyjechać z fabryki nowiusieńkim czołgiem uzyskując nowy obiekt klasy Tank za pomocą metody getTank.
Implementacja wzorca w C++
Oto przykładowa implementacja wzorca budowniczego, która opisana została na powyższym diagramie UML:
Wynik działania powyższego kodu:
Tworze czolg Typ czolgu: T34 Czolg nie ma jeszcze podwozia Czolg nie ma zamontowanego jeszcze dziala Czolg nie ma zamontowanego opancerzenia Czolg nie ma zamontowanego jeszcze silnika Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje podwozie czolgu: Proces ukonczony Typ czolgu: T34 Masa podwozia: 3000 [kg] Typ podwozia: gasienicowy Czolg nie ma zamontowanego jeszcze dziala Czolg nie ma zamontowanego opancerzenia Czolg nie ma zamontowanego jeszcze silnika Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje dzialko czolgu: Proces ukonczony Typ czolgu: T34 Masa podwozia: 3000 [kg] Typ podwozia: gasienicowy Srednica dziala: 76.2 [mm] Masa dziala: 5000 [kg] Maksymalny promien razenia dziala: 3 [km] Czolg nie ma zamontowanego opancerzenia Czolg nie ma zamontowanego jeszcze silnika Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje pancerz czolgu: Proces ukonczony Typ czolgu: T34 Masa podwozia: 3000 [kg] Typ podwozia: gasienicowy Srednica dziala: 76.2 [mm] Masa dziala: 5000 [kg] Maksymalny promien razenia dziala: 3 [km] Masa zbroi: 15000 [kg] Wytrzymalosc zbroi: 1000 [punkty wytrzymalosci] Czolg nie ma zamontowanego jeszcze silnika Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje silnik czolgu: Proces ukonczony Typ czolgu: T34 Masa podwozia: 3000 [kg] Typ podwozia: gasienicowy Srednica dziala: 76.2 [mm] Masa dziala: 5000 [kg] Maksymalny promien razenia dziala: 3 [km] Masa zbroi: 15000 [kg] Wytrzymalosc zbroi: 1000 [punkty wytrzymalosci] Masa silnika: 500 [kg] Moc silnika: 500 [KM] Zuzycie paliwa: 100 [litr/100 km] Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje zbiornik paliwa czolgu: Proces ukonczony Typ czolgu: T34 Masa podwozia: 3000 [kg] Typ podwozia: gasienicowy Srednica dziala: 76.2 [mm] Masa dziala: 5000 [kg] Maksymalny promien razenia dziala: 3 [km] Masa zbroi: 15000 [kg] Wytrzymalosc zbroi: 1000 [punkty wytrzymalosci] Masa silnika: 500 [kg] Moc silnika: 500 [KM] Zuzycie paliwa: 100 [litr/100 km] Maksymalna pojemnosc zbiornika paliwa: 480 Poziom paliwa w zbiorniku paliwa: 480 Czolg zlozony, ukonczony!!! Biez czolg, znikaj i po polu fikaj!!! Tworze czolg Typ czolgu: A1M1 Abrams Czolg nie ma jeszcze podwozia Czolg nie ma zamontowanego jeszcze dziala Czolg nie ma zamontowanego opancerzenia Czolg nie ma zamontowanego jeszcze silnika Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje podwozie czolgu: Proces ukonczony Typ czolgu: A1M1 Abrams Masa podwozia: 5000 [kg] Typ podwozia: gasienicowy Czolg nie ma zamontowanego jeszcze dziala Czolg nie ma zamontowanego opancerzenia Czolg nie ma zamontowanego jeszcze silnika Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje dzialko czolgu: Proces ukonczony Typ czolgu: A1M1 Abrams Masa podwozia: 5000 [kg] Typ podwozia: gasienicowy Srednica dziala: 105 [mm] Masa dziala: 10000 [kg] Maksymalny promien razenia dziala: 4 [km] Czolg nie ma zamontowanego opancerzenia Czolg nie ma zamontowanego jeszcze silnika Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje pancerz czolgu: Proces ukonczony Typ czolgu: A1M1 Abrams Masa podwozia: 5000 [kg] Typ podwozia: gasienicowy Srednica dziala: 105 [mm] Masa dziala: 10000 [kg] Maksymalny promien razenia dziala: 4 [km] Masa zbroi: 30000 [kg] Wytrzymalosc zbroi: 3000 [punkty wytrzymalosci] Czolg nie ma zamontowanego jeszcze silnika Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje silnik czolgu: Proces ukonczony Typ czolgu: A1M1 Abrams Masa podwozia: 5000 [kg] Typ podwozia: gasienicowy Srednica dziala: 105 [mm] Masa dziala: 10000 [kg] Maksymalny promien razenia dziala: 4 [km] Masa zbroi: 30000 [kg] Wytrzymalosc zbroi: 3000 [punkty wytrzymalosci] Masa silnika: 500 [kg] Moc silnika: 1335 [KM] Zuzycie paliwa: 37 [litr/100 km] Czolg nie ma zamontowanego jeszcze zbiornika paliwa Buduje zbiornik paliwa czolgu: Proces ukonczony Typ czolgu: A1M1 Abrams Masa podwozia: 5000 [kg] Typ podwozia: gasienicowy Srednica dziala: 105 [mm] Masa dziala: 10000 [kg] Maksymalny promien razenia dziala: 4 [km] Masa zbroi: 30000 [kg] Wytrzymalosc zbroi: 3000 [punkty wytrzymalosci] Masa silnika: 500 [kg] Moc silnika: 1335 [KM] Zuzycie paliwa: 37 [litr/100 km] Maksymalna pojemnosc zbiornika paliwa: 1900 Poziom paliwa w zbiorniku paliwa: 1900 Czolg zlozony, ukonczony!!! Biez czolg, znikaj i po polu fikaj!!!