Graditelj (projektni uzorak)

Graditelj (engl. Builder) je objektno-orijentisani projektni uzorak. Pripada kategoriji objektnih uzoraka kreiranja. Koristi se zarad razdvajanja pravljenja složenog objekta od njegove reprezentacije, odnosno korak-po-korak pravljenja složenog objekta od jednostavnijih.[1][2][3]

Česte upotrebe uredi

Graditelj je dosta koristan kada je potrebno da izgradnja složenog objekta bude nezavisna od njegovih delova.[1] Time se postiže da se proizvedu različite reprezentacije složenog objekta koji se izgrađuje.[1][2] Zbog toga je ovaj projektni uzorak jedan od najboljih načina za izgradnju složenijih objekata. Graditelj se često koristi i za izgradnju sastava.[4]

Učesnici uredi

Graditelj ima četiri učesnika.

Proizvod uredi

Predstavlja složeni objekat koji treba da se izgradi. Uključuje sve klase ili interfejse koji su potrebni da opišu delove koji će se koristiti za izgradnju složenog objekta.[1]

Graditelj uredi

Određuje interfejs za izgradnju proizvoda koji je potrebno implementirati.[1][3]

Konkretan graditelj uredi

Implementira interfejs graditelja za izgradnju konkretnog proizvoda koji se čuva i koji se po potrebi može dohvatiti.[1][3]

Upravljač uredi

On zapravo izgrađuje složeni objekat, preko konkretnog graditelja.[1][3]

Dijagram klasa uredi

 
Dijagram klasa projektnog uzorka Graditelj

Dijagram klasa za projektni uzorak graditelj se nalazi na slici desno. Prikazan je preko Objedinjenog jezika za modeliranje.

Prednosti i mane uredi

Graditelj omogućava izolaciju proizvoda od klijenata, jer klijenti ništa ne treba da znaju o klasama koje definišu unutrašnju strukturu proizvoda.[1] Takođe, preko upravljača se omogućuje izgradnja složenog objekta u koracima.[2] Zbog apstraktnosti interfejsa graditelja upravljaču, sve što je potrebno za izmenu unutrašnje reprezentacije proizvoda jeste zamena ili definicija novog konkretnog graditelja.[1] Ipak, ovo može nekad biti i mana, jer je potreban različit konkretan graditelj za različite tipove proizvoda.[5] Osim toga, mana može biti i to što se ovim uzorkom uvodi dodatna indirekcija preko konkretnog graditelja, čime korisnici sada postaju zavisni od njega prilikom izgradnje željenih objekata.[2]

Implementacija uredi

Prilikom implementacije ovog projektnog uzorka, treba voditi računa da interfejs za graditelja bude što opštiji, koliko je god to moguće, da bi se omogućili razni konkretni graditelji. Nekada to znači deklarisanje što više operacija od kojih bi svaka podržala pravljenje jednog dela. U vezi sa time, nekada treba voditi računa da se za pravljenje delova mogu koristiti već gotovi drugi delovi. Takođe, kako su za različite slučajeve proizvodi veoma različiti i sa drugačijim interfejsima, nema potrebe za apstraktnom klasom za proizvod više u hijerarhiji. Kada se radi sa jezikom C++, korisno je metode postaviti kao prazne, a ne kao čiste virtuelne, jer se omogućuje tada korisnicima da "pregaze" (override) one operacije koje žele. Time im se olakšava izrada sopstvenih konkretnih graditelja, jer ne moraju da vode računa o svim metodama.[1]

Ispod je dat primer implementacije graditelja na programskom jeziku Java, preuzet sa sajta koji se može naći na spoljašnjim linkovima.[6] Radi se o jednostavnom primeru izgradnje automobila koristeći graditelja. Klase su, naravno, posebni fajlovi i potrebno je uključiti odgovarajuće pakete, ali su ovde prikazani na jednom mestu.

Java uredi

//Klasa Car predstavlja Proizvod
class Car {
    private String color;

    public Car() {}

    @Override
    public String toString() {
        return "Car [color=" + color + "]";
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

//Interfejs CarBuilder je zapravo apstraktni Graditelj kojeg ce implementirati Konkretni graditelji
interface CarBuilder {
    void setColor(String color);
    Car getResult();
}

//Klasa CarBuilderImpl je primer Konkretnog graditelja
class CarBuilderImpl implements CarBuilder {
    private Car car;

    public CarBuilderImpl() {
        car = new Car();
    }

    @Override
    public void setColor(String color) {
        car.setColor(color);
    }

    @Override
    public Car getResult() {
        return car;
    }
}

//CarBuildDirector je zapravo Upravljac
public class CarBuildDirector {
    private CarBuilder builder;

    public CarBuildDirector(CarBuilder builder) {
        this.builder = builder;
    }

    public Car construct() {
        builder.setColor("Red");
        return builder.getResult();
    }

    public static void main(String[] args) {
        CarBuilder builder = new CarBuilderImpl();
        CarBuildDirector carBuildDirector = new CarBuildDirector(builder);
        System.out.println(carBuildDirector.construct());
    }
}

Literatura uredi

Reference uredi

  1. ^ a b v g d đ e ž z i Johnson, Ralph; Gamma, Erich; Vlissides, John; Helm, Richard (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. str. 97-105. 
  2. ^ a b v g „The Builder design pattern - Problem, Solution, and Applicability”. w3sDesign.com. Pristupljeno 04. 01. 2019. 
  3. ^ a b v g Kalenzaga, Christophe. „Design pattern: singleton, prototype and builder”. coding-geek.com. Arhivirano iz originala 05. 01. 2019. g. Pristupljeno 04. 01. 2019. 
  4. ^ „Builder Design Pattern”. Source making. Pristupljeno 04. 01. 2019. 
  5. ^ „THE BUILDER PATTERN”. OctoPerif. Pristupljeno 04. 01. 2019. 
  6. ^ Morgun, Ivan. „Builder design pattern in Java, Kotlin and Python”. proft.me. Pristupljeno 04. 01. 2019. 

Spoljašnje veze uredi