В моем клиенте я хотел бы указать стратегии, которые будут использоваться в классе, создаваемом строителем.
Однако я не могу передать эти объекты стратегии строителю, поскольку их инициализация частично обрабатывается строителем.Тем не менее, мне все еще нужно сообщить конструктору, какой объект использовать и какие дополнительные параметры передать ему.
Вот класс Builder
public class MarketGeneratorBuilder {
private MarketGenerator.Parameters parameters;
public MarketGeneratorBuilder(MarketGenerator.Parameters parameters) {
this.parameters = parameters;
}
public MarketGenerator build() {
return new MarketGenerator(
parameters,
new GoodsGenerator(
new UniformDistribution(
new ValueRange(0,parameters.getNumberOfLevels()-1)
)
),
new ITGenerator(),
new OTGenerator(),
new IOTGenerator(
new UniformDistribution(
new ValueRange(1,parameters.getNumberOfLevels()-2)
),
new BundlesGenerator(
new ForwardMarkovDistribution(
new MarkovDistribution.Parameters(
new ValueRange(0,parameters.getNumberOfLevels()-1),
0.1,
0.1
)
),
new UniformDistribution(
new ValueRange(1,parameters.getNumberOfGoodsToCreate()-1)
)
),
new BundlesGenerator(
new BackwardMarkovDistribution(
new MarkovDistribution.Parameters(
new ValueRange(0,parameters.getNumberOfLevels()-1),
0.2,
0.2
)
),
new UniformDistribution(
new ValueRange(1,parameters.getNumberOfGoodsToCreate()-1)
)
)
)
);
}
}
Распределения (UniformDistribution, ForwardMarkovDistribution, ForwardMarkovDistribution и, возможно, еще больше впереди.) сейчас жестко запрограммированы, но должны быть выбраны клиентом.Диапазон значений определяется Builder (объекты ValueRange).Тем не менее, некоторые дистрибутивы принимают дополнительные параметры (ForwardMarkovDistribution принимает ValueRange, alpha, beta), которые должны быть определены клиентом.
Единственное решение, которое я вижу, - это вытащить ValueRange из конструктора в сеттер.Но это кажется неправильным, поскольку это существенное поле для объекта.Также я бы хотел, чтобы клиентский код не содержал внутренней логики компоновщика.Скорее,
DistributionType levelDistribution = new DistributionType(Distributions.UNIFORM);
DistributionType goodsDistribution = new DistributionsType(Distributions.MARKOV_FORWARD, 0.1,0.1);
Но в этом случае я не понимаю, как обеспечить целостность данных.Это означает, что когда клиент выбирает Distributions.UNIFORM, больше нет параметров для передачи.Или в случае с Distributions.MARKOV_FORWARD он должен пройти альфа и бета.
Итак, я надеялся, что вы сможете указать мне лучший образец.Спасибо!