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.
publicznyklasaPizza{
// nieruchomości
prywatnyint numer zamówienia;
prywatny Strunowy ciasto na pizzę;
prywatny Strunowy byczy;
// pobierające i ustawiające
publicznyintpobierz numer zamówienia(){
powrót numer zamówienia;
}
publicznypróżniaustaw numer zamówienia(int numer zamówienia){
Ten.numer zamówienia = numer zamówienia;
}
publiczny Strunowy dostaćPizzaCiasto(){
powrót ciasto na pizzę;
}
publicznypróżniazestawPizzaCiasto(ciasto na pizzę){
Ten.pizzaCiasto = PizzaCiasto;
}
publiczny Strunowy getTopping(){
powrót byczy;
}
publicznypróżniazestawTopping(Nadzienie sznurkowe){
Ten.topping = topping;
}
}
Klasa budowniczych
Pizza klasa Javy ma trzy właściwości i odpowiadające im metody pobierające i ustawiające, ale ich nie ma metody konstruktora. Interfejs konstruktora pozwoli ci stworzyć każdy aspekt obiektu pizzy osobno. Pozwoli ci to odzyskać cały obiekt pizzy.
publicznyinterfejsBudowniczy{
publicznypróżniautwórzPizzaCiasto();
publicznypróżniautwórzTopping();
publiczny Pizza dostać pizzę();
}
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.
publicznyklasaCheesePizzaBuilderprzyboryBudowniczy{
prywatny pizza pizza;
publicznyCheesePizzaBuilder(){
Ten.pizza = nowy Pizza();
}
@Nadpisanie
publicznypróżniautwórzPizzaCiasto(){
Ten.pizza.setPizzaCiasto("Ciasto");
}
@Nadpisanie
publicznypróżniautwórzTopping(){
Ten.pizza.setTopping("Ser");
}
@Nadpisanie
publiczny Pizza dostać pizzę(){
powrótTen.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 wykonać 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.
publicznyklasaDyrektor{
prywatny Konstruktor pizzy Konstruktor;
publicznyDyrektor(Konstruktor pizzyBuilder){
Ten.pizzaBuilder = pizzaBuilder;
}
publiczny Pizza dostać pizzę(){
powrótTen.pizzaBuilder.getPizza();
}
publicznypróżniazrobić pizzę(){
Ten.pizzaBuilder.createPizzaCiasto();
Ten.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.