Зарегистрируйтесь, чтобы продолжить обучение

Паттерны 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();
    }
}

Паттерн "Фабрика"

Фабрика - это паттерн проектирования, который определяет общий интерфейс для создания объектов, позволяя создавать тип выбираемых объектов


TransportFactory transportFactory = new TransportFactory();
Transport wagon = transportFactory.getTransport("wagon");
Transport ship = transportFactory.getTransport("ship");
List<Transport> transports = new ArrayList<>();
transports.add(wagon);
transports.add(ship);

for (Transport transport : transports) {
    transport.deliver();
}

Класс TransportFactory

public class TransportFactory {
    public static final String WAGON_NAME = "wagon";
    public static final String SHIP_NAME = "ship";

    public Transport getTransport(String name) {
        if (Object.equals(name, WAGON_NAME)) {
            return new Wagon();
        } else if (Object.equals(name, SHIP_NAME)) {
            return new Ship();
        }

        return null;
    }
}

Интерфейс Transport

public interface Transport {
    void deliver();
}

Классы Ship и Wagon

public class Ship implements Transport {
    public void deliver() {
        System.out.println("SHIP: I deliver an object");
    }
}
public class Wagon implements Transport {
    public void deliver() {
        System.out.println("WAGON: I deliver an object");
    }
}

Паттерн "Прототип"

Прототип – это паттерн проектирования, который позволяет копировать объекты, не вдаваясь в подробности их реализации

Bmw bmw = new Bmw();
bmw.setTurboModeOn(true);
bmw.setName("BMW 320i");
bmw.setMaxSpeed(260);

Car bmw2 = bmw.clone();
System.out.println(bmw2);

Kia kia = new Kia();
kia.setMaxSpeed(230);
kia.setBlindZonesControl(true);


Car kia2 = kia.clone();
System.out.println(kia2);

Интерфейс Car

public interface Car {
    Car clone();
}

Классы Bmw и Kia

@Getter
@Setter
@ToString
public class Bmw implements Car {
    private int maxSpeed;
    private String name;
    private boolean isTurboModeOn;

    @Override
    public Car clone() {
        Bmw bmw = new Bmw();
        bmw.setMaxSpeed(this.getMaxSpeed());
        bmw.setIsTurboModeOn(this.isTurboModeOn());
        bmw.setName(this.getName());

        return bmw;
    }
}
@Getter
@Setter
@ToString
public class Kia implements Car {
    private int maxSpeed;
    private boolean isBlindZoneControl;

    @Override
    public Kia clone() {
        Kia kia = new Kia();
        kia.setBlindZonesControl(this.isBlindZoneControl);
        kia.setMaxSpeed(this.getMaxSpeed());

        return kia;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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