Паттерн 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;
}
}
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.