Sobes.tech
Middle

რა არის დიზაინის ნიმუში 'მშენებელი' (Builder)?

sobes.tech AI

პასუხი AI-სგან

"შენებლის" (Builder) ნიმუში — ეს არის შექმნის დიზაინის ნიმუში, რომელიც საშუალებას აძლევს შექმნას რთული ობიექტები ეტაპობრივად, სხვადასხვა კონფიგურაციის ვარიანტების მიწოდებით.

  • დანიშნულება: პროცესის გამიჯვნა ობიექტის კონსტრუქციიდან მისი წარმოდგენისგან. საშუალებას აძლევს მიიღოს სხვადასხვა წარმოდგენა ერთსა და იმავე კონსტრუქციის პროცესზე.
  • უპირატესობები:
    • საშუალებას აძლევს ეტაპობრივად ააშენოს ობიექტი, დამალული კონსტრუქციის დეტალები.
    • ამარტივებს ობიექტების შექმნას დიდი რაოდენობით არასავალდებულო პარამეტრებით (შედარებით კონსტრუქტორებთან, რომლებიც იყენებენ მრავალ არგუმენტს ან ანტიპატერნს Telescoping Constructors).
    • შეიძლება გამოიყენოს ერთი და იგივე კოდი ობიექტის სხვადასხვა წარმოდგენისთვის.
  • ძირითადი მონაწილეები:
    1. Builder (შენებელი): ინტერფეისი ან აბსტრაქტული კლასი, რომელიც განსაზღვრავს ობიექტის ნაწილების მშენებლობის ნაბიჯებს.
    2. ConcreteBuilder (კონკრეტული შენებელი): ინტერფეისის Builder რეალიზაცია, რომელიც ქმნის კონკრეტულ ნაწილებს და უზრუნველყოფს საბოლოო შედეგის მიღებას.
    3. Director (დირექტორი): განსაზღვრავს ნაბიჯების სერიის ობიექტის შესაქმნელად, გამოყენებით Builder ობიექტი. დირექტორი არ არის აუცილებელი და მომხმარებელი შეიძლება პირდაპირ მუშაობდეს შენებელთან.
    4. Product (პროდუქტი): წარმოდგენილი ობიექტი, რომელიც აშენდება.

სტრუქტურის მაგალითი (Java):

// პროდუქტი
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 + "]";
    }
}

// შენებლის ინტერფეისი
interface CarBuilder {
    void buildEngine();
    void buildWheels();
    void buildColor();
    Car getResult();
}

// კონკრეტული შენებელი
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;
    }
}

// დირექტორი (სურვილისამებრ)
class CarDirector {
    private CarBuilder builder;

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

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

// მომხმარებლის კოდი
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("შენებული მანქანა: " + sportsCar);

        // პირდაპირი გამოყენება დირექტორის გარეშე
        CarBuilder anotherSportsCarBuilder = new SportsCarBuilder();
        anotherSportsCarBuilder.buildEngine();
        anotherSportsCarBuilder.buildColor(); // მშენებლობა გარეშე ბორბლების
        Car partialCar = anotherSportsCarBuilder.getResult();
        System.out.println("შენებული ნაწილობრივი მანქანა: " + partialCar);
    }
}