Middle
Proqram təminatı inkişafı kontekstində builder (yaradıcı) nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Dərinlikli obyektin qurulmasını onun təqdimatından ayıran və eyni inşaat prosesinin müxtəlif təqdimatlarını yaratmağa imkan verən dizayn nümunəsi.
Əsas xüsusiyyətlər:
- Məsuliyyətlərin bölünməsi: Obyektin yaradılması (quruluş addımları) və obyektin təqdimatı (nəticə məhsulu) ayrıdır.
- Addım-addım quruluş: Obyekt addım-addım qurulur, bu da prosesi daha çevik və anlaşılan edir.
- Fərqli təqdimatlar: Eyni quruluş prosesi müxtəlif obyekt variantlarının yaradılmasında istifadə oluna bilər.
- İnkapsulyasiya: Obyektin yaradılmasının detalları müştəridən gizlidir, bu da onun istifadəsini sadələşdirir.
Əsas iştirakçılar:
- Builder (Tərtibçi): Məhsulun hissələrinin yaradılması üçün addımları müəyyən edən abstrakt interfeys və ya sinif.
- ConcreteBuilder (Möhkəm Tərtibçi): Məhsulun hissələrini faktiki olaraq tərtib edən və nəticəni saxlayan konkret tərtibçi.
- Director (İdarəçi): ConcreteBuilder obyektindən istifadə edərək məhsulu tərtib edən və müvafiq metodları müəyyən ardıcıllıqla çağıran sinif.
- Product (Məhsul): Yaradılan mürəkkəb obyekt.
İstifadə nümunəsi:
Fərqli tərkib hissələri olan Pizza obyektinin yaradılması:
// Məhsul
class Pizza {
private String dough;
private String sauce;
private String cheese;
private List<String> toppings;
public void setDough(String dough) { this.dough = dough; }
public void setSauce(String sauce) { this.sauce = sauce; }
public void setCheese(String cheese) { this.cheese = cheese; }
public void addTopping(String topping) {
if (toppings == null) {
toppings = new ArrayList<>();
}
toppings.add(topping);
}
@Override
public String toString() {
return "Pizza with dough: " + dough + ", sauce: " + sauce + ", cheese: " + cheese + ", toppings: " + toppings;
}
}
// Builder interfeysi
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getResult();
}
// ConcreteBuilder
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
}
@Override
public void buildDough() {
pizza.setDough("İncə xəmər");
}
@Override
public void buildSauce() {
pizza.setSauce("Pomidor sousu");
}
@Override
public void buildCheese() {
pizza.setCheese("Mozzarella");
}
@Override
public void addTopping(String topping) {
// Margherita əlavə toppings olmadan hazırlanır
}
@Override
public Pizza getResult() {
return pizza;
}
}
// Director
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Əlavə toppings burada pizza növü və tələblərə əsasən əlavə oluna bilər
}
}
// Müştəri kodu
public class PizzaShop {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
cook.setPizzaBuilder(margheritaBuilder);
cook.constructPizza();
Pizza pizza = margheritaBuilder.getResult();
System.out.println(pizza);
}
}
İstifadə halları:
- Çox sayda qeyri-zorunlu parametrə malik mürəkkəb obyekt yaratmaq lazımdır.
- Yaratma prosesi ardıcıl və çox addımlı olur.
- Eyni algoritm istifadə edilərək eyni obyektin müxtəlif variantları yaradılmalıdır.
- "Telescoping constructor" (uzanan konstruktor) istifadə etməkdən qaçınmaq lazımdır.
Üstünlüklər:
- Kodun oxunaqlığını və saxlanmasını yaxşılaşdırır.
- Obyektlərin yaradılmasında çeviklik təmin edir.
- Dəyişməz obyektlərin yaradılmasına imkan verir.
- Çox sayda konstruktorun qarşısını alır.
Çətinliklər:
- Layihədə siniflərin sayını artıra bilər (hər obyekt tipi və hər tərtibçi üçün).
- Əvvəlcədən dizayn üçün müəyyən səy tələb edir.