Wzorce projektowe – Builder

Posted on Posted in Java SE

Opis

Budowniczy obiektów zapewnia większą kontrolę nad poprawnością tworzenia obiektu.Przyda nam się jako alternatywa dla wielu różnorodnych konstruktorów, czym przysłuży się do wzrostu czytelności kodu oraz uniknięcia podstawienia zmiennej w złe miejsce , szczególnie gdy do konstrukcji obiektu potrzebujemy wielu parametrów.

Przykładowe implementacje dla klasycznego builder w wersji GOF , oraz podejścia alternatywnego  wykorzystującego klasę wewnętrzną jako buildera.

Przepis na implementacje

1) Zaimplementuj klasę wraz z właściwościami – tą którą będziemy później budowali.

 

2) Stwórz abstrakcyjną klasę Buildera posiadającą pole klasy z punktu 1 wraz z metodą build() zwracającą obiekt klasy z pkt 1. oraz abstrakcyją metodę void compose()

 

3) Następnie zaimplementuj konkretne Buildery. W ramach metody compose () utwórz obiekt klasy z punktu 1. W ramach metody build() wywołaj metodę compose()

 

4) Implementacja obiektu Dyrektora powinna zawierać pole zgodne z klasą abstrakcyjną Builder z punktu 2 inicjalizowane konstruktorem, oraz ustawialne metodą set. Klasa dyrektora powinna posiadać metodę zwracającą obiekt klasy z punktu 1 a jej implementacja powinna wywoływać metodę build() na ustawionego buildera.

 

Przepis Builder jako wewnętrzna klasa statyczna :

1 ) Zaimplementuj swoją klasę  i umieść w niej wszystkie wymagane właściwości

 

2) Nadpisz domyślny bezparametrowy konstruktor i oznacz go jako private by uniemożliwić stworzenie obiektu z zewnątrz klasy.

 

3) Stwórz kolejny prywatny konstruktor tym razem przyjmujący obiekt klasy Builder o której za chwilę

 

4)  Wewnątrz utworzonej klasy stwórz wewnętrzną statyczną klasę Builder, musi ona mieć publiczny konstruktor , pola zgodne z polami klasy otaczającej oraz metodę build () zwracającą obiekt klasy otaczającej. Wszystkie metody ustawiające właściwości pól buildera powinny zwracać obiekt klasy Builder czyli this.

Klasa Train będzie odtąd wyglądała tak :

 

5) Obiekt klasy zewnętrznej możesz teraz tworzyć za pośrednictwem klasy wewnętrznej Build z podaniem ciągu metod ustawiających właściwości buildera a następnie wywołując metodę build(), która z kolei odwoła się do konstruktora klasy otaczającej przyjmującej obiekt klasy Builder. Jest to możliwe ze względu na dość specyficzną właściwość klas wewnętrznych – mianowicie obiekty klasy wewnętrznej mają dostęp do wszystkich właściwości i metod klasy otaczającej także tych prywatnych.

Przykład użycia :

 

 

 

3 thoughts on “Wzorce projektowe – Builder

  1. Cześć,

    Wkleiłem cały ten kod ale jednak wywala mi kilka błędów…
    Ale główny problem mam z tym…

    public void composeTrain() {
    train = new Train();
    train.setCarriagesNumber(30);
    train.setLocomotivesNumber(2);
    train.setTrainType(TrainType.CARGO);
    }

    o ile przy TrainType dodałem klasę ENUM i tu jest ok o tyle nie mogę stworzyć obiektu Train…
    Mógłbyś podać pełny kod do tego?

    Pozdrawiam.

  2. Mam jedną uwagę odnośnie fragmentu „obiekty klasy wewnętrznej mają dostęp do wszystkich właściwości i metod klasy otaczającej także tych prywatnych.” – z tego co mi wiadomo, zasada ta nie ma zastosowania w klasach zagnieżdżonych (czyt. statycznych) co wynika z faktu, że klasa statyczna nie wymaga f

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *