fbpx

Wzorce projektowe – Metoda wytwórcza

Wzorce projektowe – Metoda wytwórcza

Każdy, kto zetknął się z programowaniem, na pewno słyszał o czymś takim jak wzorce projektowe. Na początku drogi nie bardzo wiemy, po co one są, w czym niby mają pomóc i jak je rozumieć. W sieci jest wiele instrukcji, jak działa jakiś wzorzec, kiedy go stosować i jak go budować. Jednak mam wrażenie, że gdy szukam rozwiązania i trafie na jedną stronę z wyjaśnieniem np. czym jest metoda wytwórcza i nie daj boże, nie zrozumiem tego, co jest tam napisane, to już nigdzie nie znajdę odpowiedzi. Dlaczego? Bo na każdej stronie jest dokładnie ten sam przykład, opis jest lakoniczny, nie ma łopatologicznie wyłożonej teorii. Zwykle to właśnie osoby początkujące szukają tych informacji i potrzebują prostego języka.

W tym momencie stawiam sobie bardzo wysoko poprzeczkę, ale raz się żyje. Jeśli to, co za chwile przeczytasz, nie będzie wystarczająco jasne, to daj znać w komentarzu. W końcu robię to dla Ciebie. Skoro wszędzie jest to samo to może mi uda się zrobić coś nowego, a przynajmniej innego. Przykłady będą oczywiście w PHP. Już na samym początku proszę Cię o to, abyś dał mi jakiś feedback czy taka forma jest lepsza/gorsza niż to, co możesz spotkać na innych stronach. Czy to będzie jedynie komentarz, czy kciuk do góry na fb, czy serducho na insta. Proszę daj znać, żebym wiedziała, czy ten eksperyment w ogóle ma sens.

Wzorce projektowe to coś, co warto znać, ponieważ w szybki sposób mogą usprawnić naszą pracę. Dodatkowo możesz zabłysnąć, proponując zastosowanie np. metody wytwórczej podczas Code Review.

Na czym polega metoda wytwórcza?

Zadaniem metody wytwórczej, jak sama nazwa wskazuje, jest coś stworzyć. Porządkuje klasy o tej samej odpowiedzialności, hierarchizuje obiekty oraz hermetyzuje proces. Co to oznacza? Robi porządek w kodzie, dzięki czemu jest bardziej czytelny, aplikacja jest bardziej elastyczna, a przyszłe zmiany tańsze.

Wzorzec ten wyróżnia dwie główne grupy klas:

  1. Klasy obiektów – produktów
  2. Klasy fabryk

Określa interfejs do tworzenia obiektów, przy czym umożliwia podklasom wyznaczenie klasy danego obiektu. Metoda wytwórcza umożliwia klasom przekazanie procesu tworzenia egzemplarzy podklasom.

To tak jakbyś podjechał do Maca i zamówił lody czekoladowe. Pani przy mikrofonie przyjmuje zamówienie i idzie do maszyny przygotować lody czekoladowe zgodnie z instrukcją lub zleca to odpowiedniemu pracownikowi. Po chwili podaje Ci je przez okienko.

Czyli mówiąc łopatologicznie, Ty zlecasz, metoda wytwórcza decyduje, kto wykona twoje zamówienia w zależności od parametru, a odpowiednia podklasa tworzy produkt.

Model

Hierarchia obiektów typu IceCream, czyli podział na smaki.

Modele powyżej przedstawiają złożoną sytuację wykorzystania metody wytwórczej, gdy mamy do czynienia z hierarchią obiektów. Zwróć jednak szczególną uwagę na poszczególne klasy tworzące pojedynczy smak. Nazywane są one fabrykami konkretnymi, bo zajmują się tworzeniem pojedynczego, konkretnego typu obiektu. To właśnie one są głównym elementem metody wytwórczej.

Przykład metody wytwórcza

<?php

class IceCream

{

    private $flavour;

    public function __construct($flavour)

    {

        $this->flavour = $flavour;

    }

    public function getFlavour()

    {

        return $this->flavour;

    }

}

class IceCreamFactory

{

    public function create($flavour)

    {

        return new IceCream($flavour);

    }

}

$iceCreamFactory = new IceCreamFactory();
$iceCream = $iceCreamFactory->create('Chocolate');

print_r($iceCream->getFlavour()); // Chocolate

Powyższy kod przedstawia najczęściej występujące zastosowanie metody wytwórczej. W podanym przykładzie mamy obiekt IceCream i klasę, która jest odpowiedzialna za jego stworzenie, czyli IceCreamFactory i to cały wzorzec. Dzięki takiej implementacji kod jest przejrzysty i elastyczny. Każda klasa ma swoją POJEDYNCZĄ odpowiedzialność. Za każdym razem, gdy w systemie będziemy potrzebowali tworzyć obiekt IceCream, nie będziemy go na nowo inicjalizwać za pomocą new, tylko wykorzystamy do tego fabrykę IceCreamfactory.

Dlaczego takie rozwiązanie jest lepsze? Ponieważ gdy w przyszłości obiekt IceCream poszerzymy o kolejne parametry czy to przez konstruktor, czy przez settery to będziemy musieli zrefaktoryzować tylko jedno miejsce, czyli fabrykę. W przypadku, gdybyśmy za każdym razem tworzyli ręcznie cały obiekt, musielibyśmy przeszukiwać system i zmieniać sposób tworzenia danego obiektu w każdym miejscu.

Zastosowanie

Metoda wytwórcza jest najczęściej wykorzystywana jako podstawowy element szkieletu aplikacji. To bardzo prosty wzorzec niby oczywisty, ale równocześnie traktowany bardzo po macoszemu. Jest podstawą do implementacji innych wzorców, które będą tematami następnych wpisów, czyli Fabryki Abstrakcyjnej oraz Template Method.

Infografika

Aby ugruntować informacje o metodzie wytwórczej, przygotowałam infografikę, która w skrócie przedstawia to, co było w dzisiejszym poście. Jeśli z czasem wylecą Ci z głowy te zasady, możesz sobie ją wydrukować lub zapisać na dysku i wracać w razie potrzeby.

Jeśli zainteresował Cię temat wzorców projektowych i chciałbyś je bliżej poznać, to zapisz się na newsletter i bądź na bieżąco lub poczytaj na wiki.

Zgarnij darmowy ebook i cotygodniową dawkę wiedzy

.
Magdalena Limanówka-Kuciel
magdalena@panizkomputerem.pl

Jestem programistką, która lubi mieć ręce pełne roboty. Do życia potrzebuje komputera z internetem i kubka gorącej kawy. Więcej na stronie o mnie.