Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Паттерны Java: Основы ООП

Паттерн Builder

// Example.java
public class Example {
    public static void main(String[] args) {
       Car car = Car.newBuilder()
               .setDoorsAmount(5)
               .setName("Renault")
               .setColor(Color.BLACK)
               .setEnginePower(129.9)
               .build();

       System.out.println(car);
    }
}

// Car.java
public class Car {
    private String name;
    private int doorsAmount;
    private double enginePower;
    private Color color;

    public String getName() {
        return name;
    }

    public int getDoorsAmount() {
        return doorsAmount;
    }

    public double getEnginePower() {
        return enginePower;
    }

    public Color getColor() {
        return color;
    }

    public Car() {

    }

    public static Builder newBuilder() {
        // Создание объекта класса Car и вложенного объекта класса Builder
        return new Car().new Builder();
    }

    // Вложенный класс
    public final class Builder {
        private String name;
        private int doorsAmount;
        private double enginePower;
        private Color color;

        private Builder() {

        }

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setDoorsAmount(int doorsAmount) {
            this.doorsAmount = doorsAmount;
            return this;
        }

        public Builder setEnginePower(double enginePower) {
            this.enginePower = enginePower;
            return this;
        }

        public Builder setColor(Color color) {
            this.color = color;
            return this;
        }

        // Метод, заполняющий поля объекта Car и возвращающий этот объект
        public Car build() {
            Car.this.color = this.color;
            Car.this.doorsAmount = this.doorsAmount;
            Car.this.enginePower = this.enginePower;
            Car.this.name = name;
            return Car.this;
        }
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Car{");
        sb.append("name='").append(name).append('\'');
        sb.append(", doorsAmount=").append(doorsAmount);
        sb.append(", enginePower=").append(enginePower);
        sb.append(", color=").append(color);
        sb.append('}');
        return sb.toString();
    }
}

Паттерн State

// Example.java
public class Example {
    public static void main(String[] args) {
        Car car2 = new Car();
        // Обращение к методам происходит через первоначальное получение состояния
        car2.getState().go();

        // start car
        car2.getState().start();
        car2.getState().go();

        car2.getState().lock();

        State state = car2.getState();
        if (state != null) {
            state.stop();
        }

        car2.getState().lock();
    }
}
// Car.java
import exercise.state.impl.LockedState;

public class Car {
    // Должна быть связь с классом состояния
    private State state;

    public Car() {
        this.state = new LockedState(this);
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}
// State.java
// Интерфейс состояния, каждое состояние должно реализовать его
public interface State {
    void go();
    void stop();
    void start();
    void lock();
}
// DriveState.java
public class DriveState implements State {
    // Должна быть связь с классом Car
    private Car car;

    public DriveState(Car car) {
        this.car = car;
    }

    @Override
    public void go() {
        System.out.println("I have gone yet.");
    }

    @Override
    public void stop() {
        System.out.println("Okey, I will stop");
        this.car.setState(new StartState(this.car));
    }

    @Override
    public void start() {
        System.out.println("I have been started.");
    }

    @Override
    public void lock() {
        System.out.println("I can't be locked.");
    }
}
// StartState.java
public class StartState implements State {
    private Car car;

    public StartState(Car car) {
        this.car = car;
    }

    @Override
    public void go() {
        Car car = this.car;
        car.setState(new DriveState(car));
        System.out.println("Okey, I can do it.");
    }

    @Override
    public void stop() {
        System.out.println("Okey, I can be stopped.");
    }

    @Override
    public void start() {
        System.out.println("I have been started.");
    }

    @Override
    public void lock() {
        Car c = this.car;
        c.setState(new LockedState(c));
        System.out.println("Car has been locked.");
    }


}

// LockedState.java
public class LockedState implements State {
    private Car car;

    public LockedState(Car car) {
        this.car = car;
    }

    @Override
    public void go() {
        System.out.println("I have been locked. I can't go before you do not start me.");
    }

    @Override
    public void stop() {
        System.out.println("I have been locked. It means that I stopped.");
    }

    @Override
    public void start() {
        Car c = this.car;
        c.setState(new StartState(c));
        System.out.println("Car has been started.");
    }

    @Override
    public void lock() {
        System.out.println("Car has been locked.");
    }
}

Дополнительные материалы

  1. Рефакторинг.Гуру

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 2 мая

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу