Czym jest wzorzec projektowy Builder?

Czym jest wzorzec projektowy Builder?

Wzorzec projektowy Builder hermetyzuje właściwości obiektu i umożliwia skonstruowanie jego reprezentacji. Ten wzorzec pozwala konstruować złożone obiekty o różnych właściwościach, mimo że należą do tej samej klasy.

Typowa klasa obiektów zawiera atrybuty, konstruktory i metody. Wzorzec konstruktora pozwala wyodrębnić logikę konstrukcyjną z klasy obiektów i umieścić ją w klasach zwanych konstruktorami. Następnie możesz użyć tych klas konstruktorów do stworzenia różnych odmian tego samego obiektu.

Implementacja wzorca konstruktora w Javie

Dobrym przykładem wzorca budowniczego jest system zamawiania pizzy, który pozwala klientom wybrać różne opcje dodatków.

Klasa produktów

Jednym ze sposobów jest uczynienie konstruktora interfejsem, ale najpierw musisz utworzyć klasę produktu. Produkt w tej przykładowej aplikacji to pizza.

public class Pizza {
    // properties
    private int orderNumber;
    private String pizzaDough;
    private String topping;

    // getters and setters
    public int getOrderNumber() {
        return orderNumber;
    }

    public void setOrderNumber(int orderNumber) {
        this.orderNumber = orderNumber;
    }

    public String getPizzaDough() {
        return pizzaDough;
    }

    public void setPizzaDough(String pizzaDough) {
        this.pizzaDough = pizzaDough;
    }

    public String getTopping() {
        return topping;
    }

    public void setTopping(String topping) {
        this.topping = topping;
    }
}

Klasa budowniczych

Klasa Pizza Java ma trzy właściwości i odpowiadające im metody pobierające i ustawiające, ale nie ma metod konstruktora. Interfejs konstruktora pozwoli ci stworzyć każdy aspekt obiektu pizzy osobno. Pozwoli ci to odzyskać cały obiekt pizzy.

public interface Builder {
    public void createPizzaDough();
    public void createTopping();
    public Pizza getPizza();
}

Aplikacja do pizzy z próbkami umożliwia klientom zamawianie dowolnych dodatków, takich jak ser, pepperoni, cebula lub różne kombinacje. Dlatego jedna pizza, którą zamówi klient, to ser.

public class CheesePizzaBuilder implements Builder {
    private Pizza pizza;

    public CheesePizzaBuilder() {
        this.pizza = new Pizza();
    }

    @Override
    public void createPizzaDough() {
        this.pizza.setPizzaDough("Dough");
    }

    @Override
    public void createTopping() {
        this.pizza.setTopping("Cheese");
    }

    @Override
    public Pizza getPizza() {
        return this.pizza;
    }
}

Klasa CheesePizzaBuilder implementuje interfejs Builder i używa go do tworzenia nowej pizzy z serem. To jest jedna z reprezentacji obiektu Pizza. Robi to również w sposób niezależny od klasy Pizza.

Klasa CheesePizzaBuilder niewiele wie o klasie Pizza, wie tylko to, co musi wiedzieć, aby zakończyć swoją funkcję. Wie, że klasa Pizza ma właściwość ciasta i polewy, i ustawia te właściwości na dwie określone wartości, które będzie miała każda pizza z serem. Teraz za każdym razem, gdy aplikacja wywoła klasę CheesePizzaBuilder, utworzy nową pizzę z polewą serową.

Klasa reżyserska

Klasa Director jest kluczowym aspektem wzorca konstruktora. Jedynym celem konkretnej klasy konstruktora jest stworzenie określonego obiektu. Osiąga to poprzez oddzielne tworzenie różnych części obiektu.

Jednak konkretne klasy konstruktora nie są świadome algorytmu. Żadna z klas budowniczych nie wie, jak zbudować ciasto przed dodaniem polewy. To jest funkcja klasy reżyserskiej.

public class Director {
    private Builder pizzaBuilder;

    public Director(Builder pizzaBuilder) {
        this.pizzaBuilder = pizzaBuilder;
    }

    public Pizza getPizza() {
        return this.pizzaBuilder.getPizza();
    }

    public void makePizza() {
        this.pizzaBuilder.createPizzaDough();
        this.pizzaBuilder.createTopping();
    }
}

Klasa Director używa interfejsu budowniczego do robienia pizzy. Jest strażnikiem algorytmu.

Zalety korzystania z wzorca projektowego Builder

Główną zaletą korzystania z wzorca projektowego konstruktora jest jego właściwość enkapsulacji. Jest to kluczowy aspekt inżynierii oprogramowania, ponieważ pomaga w tworzeniu bezpiecznych aplikacji.

Kolejną zaletą tego wzorca projektowego jest podejście do konstrukcji obiektu. Pozwala tworzyć procesy wieloetapowe, w których każdy krok jest niezależny, co ułatwia debugowanie.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *