我正在使用 Builder 模式来更轻松地创建对象。但是,标准构建器模式示例不包括我的代码中需要的错误检查。例如,对象中的accessibility
和demandMean
数组Simulator
应该具有相同的长度。代码的简要框架如下所示:
public class Simulator {
double[] accessibility;
double[] demandMean;
// Constructor obmitted for brevity
public static class Builder {
private double[] _accessibility;
private double[] _demandMean;
public Builder accessibility(double[] accessibility) {
_accessibility = accessiblity.clone();
return this;
}
public Builder demandMean(double[] demandMean) {
_demandMean = demandMean.clone();
return this;
}
// build() method obmitted for brevity
}
}
又例如,在促销优化问题中,有多种促销载体(例如传单、展示)和促销模式,它们是一组促销载体(例如无、仅宣传单、仅展示、宣传单和展示)。当我创建 时Problem
,我必须定义一组可用的车辆,并检查促销模式是否使用这些车辆的子集而不是其他一些不可用的车辆,以及促销模式是否相同(例如,没有两种“仅限传单”的促销模式)。代码的简要框架如下所示:
public class Problem {
Set<Vehicle> vehicles;
Set<PromoMode> promoModes;
public static class Builder {
Set<Vehicle> _vehicles;
Set<PromoMode> _promoModes;
}
}
public class PromoMode {
Set<Vehicle> vehiclesUsed;
}
我的问题如下:
- 是否有解决这种情况的标准方法?
- 调用方法时应该在构造函数中还是在构建器中进行错误检查
build()
? - 为什么这是“正确”的方法?