Sobes.tech
Middle

Mi az a 'Builder' (Építő) tervezési minta?

sobes.tech MI

Válasz az MI-től

A "Builder" mintázat egy létrehozó tervezési minta, amely lehetővé teszi összetett objektumok lépésről lépésre történő létrehozását, különböző konfigurációs lehetőségeket kínálva.

  • Cél: Szétválasztani az objektum építési folyamatát a megjelenítésétől. Lehetővé teszi ugyanazon építési folyamat különböző megjelenítéseinek elérését.
  • Előnyök:
    • Lehetővé teszi az objektum lépésenkénti építését, miközben elrejti az építési részleteket.
    • Könnyíti a sok opcionális paraméterrel rendelkező objektumok létrehozását (ellentétben a sok argumentummal rendelkező konstruktorokkal vagy a Telescoping Constructors anti-mintával).
    • Ugyanazt az építési kódot használhatja különböző objektum megjelenítések létrehozására.
  • Fő résztvevők:
    1. Builder (Építő): Interfész vagy absztrakt osztály, amely meghatározza az objektum részeinek építési lépéseit.
    2. ConcreteBuilder (Konkrét Építő): A Builder interfész megvalósítása, amely létrehozza az objektum konkrét részeit, és biztosítja a végső eredmény elérésének módszerét.
    3. Director (Igazgató): Meghatározza az objektum létrehozásának lépéseinek sorrendjét, a Builder objektumot használva. Az igazgató opcionális, és az ügyfél közvetlenül is dolgozhat az Építővel.
    4. Product (Termék): Az épített objektum.

Struktúra példa (Java):

// Termék
class Car {
    private String engine;
    private int wheels;
    private String color;

    public void setEngine(String engine) {
        this.engine = engine;
    }

    public void setWheels(int wheels) {
        this.wheels = wheels;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Car [engine=" + engine + ", wheels=" + wheels + ", color=" + color + "]";
    }
}

// Builder interfész
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildColor();
    Car getResult();
}

// Konkrét Builder
class SportsCarBuilder implements CarBuilder {
    private Car car = new Car();

    @Override
    public void buildEngine() {
        car.setEngine("V8");
    }

    @Override
    public void buildWheels() {
        car.setWheels(4);
    }

    @Override
    public void buildColor() {
        car.setColor("Red");
    }

    @Override
    public Car getResult() {
        return car;
    }
}

// Igazgató (Opcionális)
class CarDirector {
    private CarBuilder builder;

    public CarDirector(CarBuilder builder) {
        this.builder = builder;
    }

    public void constructCar() {
        builder.buildEngine();
        builder.buildWheels();
        builder.buildColor();
    }
}

// Ügyfél használata
public class Client {
    public static void main(String[] args) {
        CarBuilder sportsCarBuilder = new SportsCarBuilder();
        CarDirector director = new CarDirector(sportsCarBuilder);

        director.constructCar();
        Car sportsCar = sportsCarBuilder.getResult();
        System.out.println("Épített autó: " + sportsCar);

        // Közvetlen használat Igazgató nélkül
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // Készítés nélküli kerék
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("Épített részleges autó: " + partialCar);
    }
}