建造者模式:我们的总监可以直接与混凝土建造者打交道吗?

问题描述 投票:0回答:1

我正在阅读构建器设计模式并有以下疑问 - 为什么主管不能接受具体构建器类型参考?

假设我们有一个

CarBuilder
接口,由 2 个具体构建器
SUVCarBuilder
SportsCarBuilder
实现。我们看到我们的Director类就像-

public class Director {

    public void constructSportsCar(Builder builder) {
        builder.setCarType(CarType.SPORTS_CAR);
        builder.setSeats(2);
        builder.setEngine(new Engine(3.0, 0));
        builder.setTransmission(Transmission.SEMI_AUTOMATIC);
        builder.setTripComputer(new TripComputer());
        builder.setGPSNavigator(new GPSNavigator());
    }

    public void constructSUV(Builder builder) {
        builder.setCarType(CarType.SUV);
        builder.setSeats(4);
        builder.setEngine(new Engine(2.5, 0));
        builder.setTransmission(Transmission.MANUAL);
        builder.setGPSNavigator(new GPSNavigator());
    }
}

这些方法接受

Builder
类型而不是具体类型 -
SUVCarBuilder
SportsCarBuilder
。我们的主管不能接受 ConcreteBuilders 类型吗? 这样我们甚至可以从director本身返回具体的产品。

public class Director {

    public SportsCar constructSportsCar(SportsCarBuilder builder) {
        builder.setCarType(CarType.SPORTS_CAR);
        builder.setSeats(2);
        builder.setEngine(new Engine(3.0, 0));
        builder.setTransmission(Transmission.SEMI_AUTOMATIC);
        builder.setTripComputer(new TripComputer());
        builder.setGPSNavigator(new GPSNavigator());
        // Get the concrete product
        return builder.getSportsCar();
    }

    public SUVCar constructSUV(SUVCarBuilder builder) {
        builder.setCarType(CarType.SUV);
        builder.setSeats(4);
        builder.setEngine(new Engine(2.5, 0));
        builder.setTransmission(Transmission.MANUAL);
        builder.setGPSNavigator(new GPSNavigator());
        // Get the concrete product
        return builder.getSUVCar();
    }
}
java oop design-patterns builder ooad
1个回答
0
投票

我认为您误解了 Builder 模式的目的,即

将复杂对象的构造与其表示分离

DP

因此,您不会有

constructSportsCar
constructSUV
方法,而是单个
constructCar
方法:

public class Director {

    public Car constructCar(CarBuilder builder) {
        builder.setSeats();
        builder.setEngine();
        builder.setTransmission();
        builder.setTripComputer();
        builder.setGPSNavigator();
        // Get the abstract product
        return builder.getCar();
    }
}

然后您将拥有一个用于创建跑车的

CarBuilder
接口实现,以及另一个用于创建 SUV 的接口实现。

© www.soinside.com 2019 - 2024. All rights reserved.