Градитељ (пројектни узорак)

Градитељ (енгл. Builder) је објектно-оријентисани пројектни узорак. Припада категорији објектних узорака креирања. Користи се зарад раздвајања прављења сложеног објекта од његове репрезентације, односно корак-по-корак прављења сложеног објекта од једноставнијих.[1][2][3]

Честе употребе уреди

Градитељ је доста користан када је потребно да изградња сложеног објекта буде независна од његових делова.[1] Тиме се постиже да се произведу различите репрезентације сложеног објекта који се изграђује.[1][2] Због тога је овај пројектни узорак један од најбољих начина за изградњу сложенијих објеката. Градитељ се често користи и за изградњу састава.[4]

Учесници уреди

Градитељ има четири учесника.

Производ уреди

Представља сложени објекат који треба да се изгради. Укључује све класе или интерфејсе који су потребни да опишу делове који ће се користити за изградњу сложеног објекта.[1]

Градитељ уреди

Одређује интерфејс за изградњу производа који је потребно имплементирати.[1][3]

Конкретан градитељ уреди

Имплементира интерфејс градитеља за изградњу конкретног производа који се чува и који се по потреби може дохватити.[1][3]

Управљач уреди

Он заправо изграђује сложени објекат, преко конкретног градитеља.[1][3]

Дијаграм класа уреди

 
Дијаграм класа пројектног узорка Градитељ

Дијаграм класа за пројектни узорак градитељ се налази на слици десно. Приказан је преко Обједињеног језика за моделирање.

Предности и мане уреди

Градитељ омогућава изолацију производа од клијената, јер клијенти ништа не треба да знају о класама које дефинишу унутрашњу структуру производа.[1] Такође, преко управљача се омогућује изградња сложеног објекта у корацима.[2] Због апстрактности интерфејса градитеља управљачу, све што је потребно за измену унутрашње репрезентације производа јесте замена или дефиниција новог конкретног градитеља.[1] Ипак, ово може некад бити и мана, јер је потребан различит конкретан градитељ за различите типове производа.[5] Осим тога, мана може бити и то што се овим узорком уводи додатна индирекција преко конкретног градитеља, чиме корисници сада постају зависни од њега приликом изградње жељених објеката.[2]

Имплементација уреди

Приликом имплементације овог пројектног узорка, треба водити рачуна да интерфејс за градитеља буде што општији, колико је год то могуће, да би се омогућили разни конкретни градитељи. Некада то значи декларисање што више операција од којих би свака подржала прављење једног дела. У вези са тиме, некада треба водити рачуна да се за прављење делова могу користити већ готови други делови. Такође, како су за различите случајеве производи веома различити и са другачијим интерфејсима, нема потребе за апстрактном класом за производ више у хијерархији. Када се ради са језиком C++, корисно је методе поставити као празне, а не као чисте виртуелне, јер се омогућује тада корисницима да "прегазе" (override) оне операције које желе. Тиме им се олакшава израда сопствених конкретних градитеља, јер не морају да воде рачуна о свим методама.[1]

Испод је дат пример имплементације градитеља на програмском језику Јава, преузет са сајта који се може наћи на спољашњим линковима.[6] Ради се о једноставном примеру изградње аутомобила користећи градитеља. Класе су, наравно, посебни фајлови и потребно је укључити одговарајуће пакете, али су овде приказани на једном месту.

Јава уреди

//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());
    }
}

Литература уреди

Референце уреди

  1. ^ а б в г д ђ е ж з и Johnson, Ralph; Gamma, Erich; Vlissides, John; Helm, Richard (1995). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. стр. 97-105. 
  2. ^ а б в г „The Builder design pattern - Problem, Solution, and Applicability”. w3sDesign.com. Приступљено 04. 01. 2019. 
  3. ^ а б в г Kalenzaga, Christophe. „Design pattern: singleton, prototype and builder”. coding-geek.com. Архивирано из оригинала 05. 01. 2019. г. Приступљено 04. 01. 2019. 
  4. ^ „Builder Design Pattern”. Source making. Приступљено 04. 01. 2019. 
  5. ^ „THE BUILDER PATTERN”. OctoPerif. Приступљено 04. 01. 2019. 
  6. ^ Morgun, Ivan. „Builder design pattern in Java, Kotlin and Python”. proft.me. Приступљено 04. 01. 2019. 

Спољашње везе уреди