Можно ли сократить повторяющийся код в паттерне строитель java

Всем доброго дня.

  • Начал пользоваться строителем (расширенная версия). Но столкнулся с повторяющимся кодом, при создании конкретного строителя и его экземпляра в проекте.
  • В реальных проектах где приходится использовать расширенного строителя, Вы ведь не дублируете код как я по своей неосведомленности это делаю.
  • Я опять догадываюсь, что здесь могла бы помочь какая то версия коллекций.
  • А если в реале будет стройка из сотен объектов, а не из 4х машин как у меня (не будем же мы дублировать код 100 раз).

Пример кода:

public class Builder {
    public static void main(String[] args) {
        Director dir1 = new Director();
        dir1.setBld(new BuildFord());
        Car car1 = dir1.buildCar();

        Director dir2 = new Director();
        dir2.setBld(new BuildToyota());
        Car car2 = dir2.buildCar();

        Director dir3 = new Director();
        dir3.setBld(new BuildBMW());
        Car car3 = dir3.buildCar();

        Director dir4 = new Director();
        dir4.setBld(new BuildHonda());
        Car car4 = dir4.buildCar();

        System.out.print(car1 + ",\n" + car2 + ",\n" + car3 + ",\n" + car4);
    }
}

enum Transmission {AUTO, MANUAL}

class Car {
    String mark;
    Transmission transmission;
    int maxSpeed;

    @Override
    public String toString() {
        return "Car{" +
                "mark='" + mark + '\'' +
                ", transmission=" + transmission +
                ", maxSpeed=" + maxSpeed +
                '}';
    }

    public void setMark(String mark) {
        this.mark = mark;
    }

    public void setTransmission(Transmission transmission) {
        this.transmission = transmission;
    }

    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
}

//Абстрактный строитель***********************************
abstract class CarBuilder {
    Car car;

    void createCar() {
        car = new Car();
    }

    abstract void buildMark();

    abstract void buildTransmission();

    abstract void buildSpeed();

    Car getCar() {
        return car;
    }

}

//Конкретные строитель************************************
class BuildFord extends CarBuilder {//строитель Ford

    public void buildMark() {
        car.setMark("Ford");
    }

    public void buildTransmission() {
        car.setTransmission(Transmission.MANUAL);
    }

    public void buildSpeed() {
        car.setMaxSpeed(150);
    }
}

//строитель BMW*******************************************
class BuildBMW extends CarBuilder {
    public void buildMark() {
        car.setMark("BMW");
    }

    public void buildTransmission() {
        car.setTransmission(Transmission.AUTO);
    }

    public void buildSpeed() {
        car.setMaxSpeed(200);
    }
}

//строитель Honda*****************************************
class BuildHonda extends CarBuilder {
    public void buildMark() {
        car.setMark("Honda");
    }

    public void buildTransmission() {
        car.setTransmission(Transmission.AUTO);
    }

    public void buildSpeed() {
        car.setMaxSpeed(180);
    }
}

//строитель Toyota****************************************
class BuildToyota extends CarBuilder {
    public void buildMark() {
        car.setMark("Toyota");
    }

    public void buildTransmission() {
        car.setTransmission(Transmission.MANUAL);
    }

    public void buildSpeed() {
        car.setMaxSpeed(250);
    }
}

//Директор ***********************************************
class Director {
    CarBuilder builder;

    void setBld(CarBuilder b) {
        builder = b;
    }

    public Car buildCar() {
        builder.createCar();
        builder.buildMark();
        builder.buildTransmission();
        builder.buildSpeed();
        //получаем экземпляр по ссылке из конкретного строителя
        Car car = builder.getCar();
        //результат возвращаем полученный экземпляр машины в проект
        return car;
    }
}

Ответы (0 шт):