Назад к вопросам
Middle
70
questionbank

В чем заключается разница между шаблонами проектирования Builder и Facade?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Builder фокусируется на пошаговом конструировании сложного объекта, отделяя процесс создания от его представления. Он позволяет использовать один и тот же процесс конструирования для создания различных представлений объекта.

Facade предоставляет унифицированный интерфейс к набору интерфейсов в подсистеме. Он определяет высокоуровневый интерфейс, который делает подсистему более простой в использовании.

Основные отличия:

  • Назначение: Builder для создания объектов, Facade для упрощения доступа к подсистемам.
  • Фокус: Builder на процессе конструирования, Facade на упрощении использования.
  • Применение: Builder часто используется для объектов с большим количеством необязательных параметров или сложным процессом инициализации. Facade применяется для сокрытия сложности подсистемы и предоставления более удобного API.

Пример Builder (упрощенный):

// Пример класса с множеством параметров
class Car {
    private String engine;
    private String transmission;
    private int wheels;

    // Приватный конструктор для принудительного использования Builder
    private Car(Builder builder) {
        this.engine = builder.engine;
        this.transmission = builder.transmission;
        this.wheels = builder.wheels;
    }

    // Вложенный класс Builder
    public static class Builder {
        private String engine;
        private String transmission;
        private int wheels = 4; // Значение по умолчанию

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

        public Builder setTransmission(String transmission) {
            this.transmission = transmission;
            return this;
        }

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

        public Car build() {
            return new Car(this);
        }
    }

    // Геттеры (для примера)
    // ...
}

// Использование Builder
class Main {
    public static void main(String[] args) {
        Car myCar = new Car.Builder()
                .setEngine("V8")
                .setTransmission("Automatic")
                .build();
    }
}

Пример Facade (упрощенный):

// Простая подсистема
class Engine {
    public void start() {
        System.out.println("Engine starting...");
    }
}

class Gearbox {
    public void shiftUp() {
        System.out.println("Shifting up...");
    }
}

// Facade для запуска автомобиля
class CarFacade {
    private Engine engine = new Engine();
    private Gearbox gearbox = new Gearbox();

    public void startCar() {
        engine.start();
        gearbox.shiftUp();
        System.out.println("Car started.");
    }
}

// Использование Facade
class Main {
    public static void main(String[] args) {
        CarFacade carFacade = new CarFacade();
        carFacade.startCar();
    }
}