3

TL;DR:如何使用Spring IoC组合生成器模式?

我正在创建一个 Spring 项目,该项目根据某些字段的分布参数填充表(即 50% 的记录必须属于 A 类型,40% 属于 B 类型,10% 属于 C 类型;对于每种类型,50% 必须属于子类型1、亚型 2 的 20%、亚型 3 的 10% 等)。

为了加快记录创建,我有一个 RecordFactory,它计算这些参数的分布并返回一个 RecordBuilder 列表。每个 RecordBuilder 扩展 Callable 接口以同时处理和返回记录:

活动图

到目前为止,我所做的,仅考虑类型 A、B 和 C 是创建一个 TypeABuilder、TypeBBuilder 和 TypeCBuilder,它们为每种类型返回不同的 ProcessorFactory 实现:

public class RecordFactory {
    @Inject
    private transient TypeABuilder aBuilder;
    @Inject
    private transient TypeBBuilder bBuilder;
    @Inject
    private transient TypeCBuilder cBuilder;

    public List<DataBuilder> getBuilders() {
        // calculates distribution for each type and add the builders accordingly
    }
}

但是,显然,这是一个糟糕的设计。随着项目变得更加复杂,我需要为每个可能的组合设置 mxn 类。

更好的设计是使用组合,根据需要的参数创建 DataBuilder。我怎样才能在不失去 Spring IoC 的好处的情况下做到这一点?


更新:

我改变了 RecordFactory 构建 ProcessorFactory 的方式。我有一个 Builder 对象,而不是单独的 Builder 对象,它使用 Builder 模式根据我的需要创建一个 ProcessorFactory:

@Component
@Scope("prototype")
public class Builder {
    private Type type;
    private Subtype subtype;

    public Builder setType(Type type) {`
        this.type = type;
        return this;
    }

    public setSubtype(Subtype subtype) {
        this.subtype = subtype;
        return this;
    }

    public ProcessorFactory createFactory() {
        return new ProcessorFactoryImpl(this);
    }
}

public class ProcessorFactoryImpl {
    @Inject
    private transient TypeProcessor typeProcessor;

    @Inject
    private transient SubtypeProcessor subtypeProcessor;

    public ProcessorFactoryImpl(Builder builder) {
        typeProcessor.setType(builder.getType());
        processors.add(typeProcessor);
        subtypeProcessor.setSubtype(builder.getSubtype());
        processors.add(subTypeProcessor);
    }
}

现在我的问题是:当我在 Builder 中创建一个新的 ProcessorFactoryImpl 时,我无法注入我的处理器。如何在 Spring 中使用构建器模式,保持这种灵活性?

4

0 回答 0