Sobes.tech
Middle

Kas ir dizaina paraugs 'Būvētājs' (Builder)?

sobes.tech AI

Atbilde no AI

„Būvētāja“ (Builder) paraugs ir radīšanas dizaina paraugs, kas ļauj pakāpeniski veidot sarežģītus objektus, piedāvājot dažādas konfigurācijas iespējas.

  • Mērķis: atdalīt objekta būvniecības procesu no tā attēlojuma. ļauj iegūt dažādus vienas un tās pašas būvniecības procesa attēlojumus.
  • Priekšrocības:
    • ļauj pakāpeniski būvēt objektu, slēpjot būvniecības detaļas.
    • atvieglo objektu izveidi ar daudzām izvēles parametru opcijām (atšķirībā no konstruktoru ar daudz argumentiem vai antipattern Telescoping Constructors).
    • var izmantot vienu un to pašu būvniecības kodu, lai izveidotu dažādus objekta attēlojumus.
  • Galvenie dalībnieki:
    1. Būvētājs (Builder): saskarne vai abstrakta klase, kas definē objekta daļu būvniecības soļus.
    2. Konkrētais būvētājs (ConcreteBuilder): Builder saskarnes realizācija, kas izveido konkrētas objekta daļas un nodrošina galīgā rezultāta iegūšanu.
    3. Direktors (Director): nosaka soļu secību objekta izveidei, izmantojot Builder objektu. Direktors nav obligāts, un klients var strādāt tieši ar Būvētāju.
    4. Produkts (Product): attēlotais objekts, kas tiek būvēts.

Struktūras piemērs (Java):

// Produkts
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 + "]";
    }
}

// Būvētāja saskarne
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildColor();
    Car getResult();
}

// Konkrētais būvētājs
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;
    }
}

// Direktors (neobligāts)
class CarDirector {
    private CarBuilder builder;

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

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

// Klienta izmantošana
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("Būvēts auto: " + sportsCar);

        // Tieša izmantošana bez direktora
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // Bez ratiem
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("Būvēts daļējs auto: " + partialCar);
    }
}