如何在Spring Spring中使用Builder模式?

时间:2014-11-05 12:58:22

标签: java spring builder composition spring-ioc

TL; DR:如何在Spring IoC中使用组合 Builder模式?

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

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

ActivityDiagram

到目前为止,我只考虑类型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
    }
}

但是,显然,这是一个糟糕的设计。随着项目变得越来越复杂,我需要为每种可能的组合设置m x n个类。

更好的设计是使用合成,根据所需的参数创建DataBuilders。如何在不失去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中使用构建器模式,保持这种灵活性?

0 个答案:

没有答案