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