我正在阅读构建器设计模式并有以下疑问 - 为什么主管不能接受具体构建器类型参考?
假设我们有一个
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();
}
}
我认为您误解了 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 的接口实现。