Graditelj (projektni uzorak)

S Vikipedije, slobodne enciklopedije

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 | uredi izvor]

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 | uredi izvor]

Graditelj ima četiri učesnika.

Proizvod[uredi | uredi izvor]

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 | uredi izvor]

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

Konkretan graditelj[uredi | uredi izvor]

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

Upravljač[uredi | uredi izvor]

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

Dijagram klasa[uredi | uredi izvor]

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 | uredi izvor]

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 | uredi izvor]

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 | uredi izvor]

//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 | uredi izvor]

Reference[uredi | uredi izvor]

  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 | uredi izvor]