Sobes.tech
Middle

Mi az a builder a szoftverfejlesztés kontextusában?

sobes.tech MI

Válasz az MI-től

A tervezési minta, amely elválasztja egy összetett objektum felépítését annak megjelenítésétől, lehetővé téve ugyanazon építési folyamat különböző megjelenítéseinek létrehozását.

Fő jellemzők:

  • Felelősségek szétválasztása: Az objektum létrehozásának logikája (építési lépések) és az objektum megjelenítése (az eredmény) külön van választva.
  • Lépésenkénti építés: Az objektum lépésről lépésre épül, ezáltal rugalmasabbá és érthetőbbé válik a folyamat.
  • Különböző megjelenítések: Ugyanaz a felépítési folyamat különböző változatok létrehozására használható.
  • Encapsuláció: Az objektum létrehozásának részletei el vannak rejtve az ügyfél elől, ez megkönnyíti a használatát.

Fő résztvevők:

  • Builder (Építő): Egy absztrakt interfész vagy osztály, amely meghatározza a lépéseket a termék részeinek létrehozásához.
  • ConcreteBuilder (Konkrét Építő): A Builder konkrét megvalósítása, amely ténylegesen építi a termék részeit és tárolja az eredményt.
  • Director (Igazgató): Olyan osztály, amely a ConcreteBuilder objektumot használva építi a terméket, a megfelelő módszereket meghatározott sorrendben hívva.
  • Product (Termék): Az épített összetett objektum.

Használati példa:

Egy Pizza objektum létrehozása különböző összetevőkkel:

// Termék
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 tésztával: " + dough + ", szósz: " + sauce + ", sajt: " + cheese + ", feltétek: " + toppings;
    }
}

// Builder interfész
interface PizzaBuilder {
    void buildDough();
    void buildSauce();
    void buildCheese();
    void addTopping(String topping);
    Pizza getResult();
}

// Konkrét Builder
class MargheritaPizzaBuilder implements PizzaBuilder {
    private Pizza pizza;

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

    @Override
    public void buildDough() {
        pizza.setDough("Vékony tészta");
    }

    @Override
    public void buildSauce() {
        pizza.setSauce("Paradicsomszósz");
    }

    @Override
    public void buildCheese() {
        pizza.setCheese("Mozzarella");
    }

    @Override
    public void addTopping(String topping) {
        // A Margherita alapból nem tartalmaz extra feltéteket
    }

    @Override
    public Pizza getResult() {
        return pizza;
    }
}

// Igazgató
class Cook {
    private PizzaBuilder pizzaBuilder;

    public void setPizzaBuilder(PizzaBuilder pb) {
        pizzaBuilder = pb;
    }

    public void constructPizza() {
        pizzaBuilder.buildDough();
        pizzaBuilder.buildSauce();
        pizzaBuilder.buildCheese();
        // További feltéteket itt lehet hozzáadni a pizza típusától vagy követelményektől függően
    }
}

// Ügyfél kód
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);
    }
}

Alkalmazás, amikor:

  • Szükség van összetett objektum létrehozására sok opcionális paraméterrel.
  • A létrehozási folyamat szekvenciális és több lépést foglal magában.
  • Különböző variációkat kell létrehozni ugyanabból az objektumból ugyanazzal az építési algoritmussal.
  • El kell kerülni a "telescoping constructor" (csőszerű konstruktor) használatát.

Előnyök:

  • Javítja a kód olvashatóságát és karbantarthatóságát.
  • Rugalmasságot biztosít az objektumok létrehozásában.
  • Lehetővé teszi változatlan (immutable) objektumok létrehozását.
  • Megszünteti a sok konstruktőr szükségességét.

Hátrányok:

  • Növelheti a osztályok számát a projektben (minden típusú objektum és minden építő esetében).
  • Kezdeti tervezési erőfeszítést igényel.