Wzorce projektowe – Budowniczy

 lip, 02 - 2017   PHPWzorce Projektowe

budowniczy wzorzec projektowyBudowniczy jest kreacyjnym wzorcem projektowym, a więc takim, który tworzy nowe obiekty, często bardzo rozbudowane i implementujące inne obiekty. Celem użycia tego wzorca jest uporządkowanie sposobu tworzenia obiektów, co daje możliwość łatwego sterowania tym procesem.

 

 

 

Charakterystyka wzorca budowniczy

 

Zadaniem wzorca budowniczego (builder) jest rozdzielenie sposobu tworzenia obiektów od ich reprezentacji. Budowanie obiektu oparte jest na jednym procesie konstrukcyjnym i podzielone jest na mniejsze etapy. Zaletą wykorzystania tego wzorca jest możliwość łatwego sterowania, w jaki sposób przebiega proces tworzenia obiektów oraz większa skalowalność kodu. Ponadto izolujemy ten proces, który często może być bardzo skomplikowany.

Na pierwszy rzut oka budowniczy swoją strukturą przypomina wzorzec strategii. Zasadnicza różnica polega jednak na jego  przeznaczeniu. Strategia jest wzorcem czynnościowym, którego celem jest wykonywanie konkretnych zadań. Budowniczy natomiast, jak sama nazwa wskazuje, skupia się na tworzeniu (budowaniu) i zwracaniu konkretnych obiektów, które często są bardzo skomplikowane.

Poniższy diagram klas UML pokazuje podstawową strukturę kodu w opisywanym wzorcu.

 

diagram UML wzorzec projektowy budowniczy

 

Omówienie diagramu zacznijmy od końca. Produkt to obiekt, które chcemy tworzyć (budować) w naszym programie. Budowniczy dostarcza interfejs do tworzenia tego obiektu, natomiast Konkretny Budowniczy, który implementuje ten interfejs, jest konkretną reprezentacją Produktu. Na końcu mamy Nadzorcę (inaczej Kierownik, Dyrektor), który zleca budowę Produktu za pomocą Budowniczego oraz dba o proces konstrukcyjny.

 

 

 

Przykład zastosowania wzorca budowniczy – budujemy robota

 

Poniżej opisany został przykład użycia wzorca projektowego budowniczy, na podstawie skryptu w języku PHP, którego zadaniem jest zbudowanie prostego obiektu robota.

W pierwszej kolejności skupmy się na klasie Produktu, czyli w tym przypadku klasie naszego Robota. Robot implementuje interfejs, przy pomocy którego ustawiane są poszczególne części takie jak głowa, korpus, ręce i nogi.

W dalszej kolejności tworzymy interfejs Budowniczego. W tym przypadku wywołuje on poszczególne metody Robota, ustawiające jego części oraz na końcu zwraca obiekt robota.

Następnie napiszemy konkretną klasę Budowniczego. Na potrzeby przykładu niech to będzie robot zbudowany z puszki aluminiowej o nazwie. Konkretny Budowniczy implementuje powyższy interfejs. Obiekt robota tworzony jest w konstruktorze.

Ostatnim elementem będzie napisanie Nadzorcy, którego w tym przypadku nazwałem Inżynierem. Zadaniem Inżyniera jest wybudowanie robota i zadbanie o cały proces (np. kolejność wywoływania odpowiednich metod).

Wszystkie elementy przykładu są już napisane. Na końcu trzeba w odpowiedni sposób użyć tak napisanego programu. Klient poniżej realizuje przebieg procesu budowania robota.

W pierwszej kolejności klient tworzy obiekt konkretnego Robota (Produktu), którego chce wybudować, a następnie tworzy obiekt Inżyniera (Nadzorcy) i przekazuje mu referencję do obiektu budowniczego, z którego ma korzystać. Następnie klient zleca skonstruowanie Produktu. Nadzorca zleca Budowniczemu wykonanie w odpowiedniej kolejności wszystkich czynności potrzebnych do utworzenia Produktu. Klient dostaje od Nadzorcy gotowy Produkt.

 

Powyższy przykład można pobrać tutaj: robot-builder

Przykład na GitHub: https://github.com/molitorys/design-patterns/tree/master/src/Builder/Robot

 

 

Podsumowanie

 

Zaletą stosowania opisywanego wzorca jest oddzielenie procesu tworzenia obiektów od ich implementacji oraz duża możliwość zróżnicowania wewnętrznych struktur klas. Ponadto zwiększa się możliwość kontrolowania procesu tworzenia obiektów. Zwiększona jest również skalowalność, dodawanie nowych reprezentacji obiektów jest bardzo prosta.


Przeczytaj równierz