Java 如何将生成器模式与Spring注释一起使用

Java 如何将生成器模式与Spring注释一起使用,java,spring,design-patterns,builder,Java,Spring,Design Patterns,Builder,我想在我的代码中消除太多的“新”创建。 所以我决定使用生成器模式。如果可能的话,我还想利用Spring@Autowired public class Car { @Autowired private Radio radio; @Autowired private Speaker speaker; @Autowired private Engine engine; private String model; public Ca

我想在我的代码中消除太多的“新”创建。 所以我决定使用生成器模式。如果可能的话,我还想利用Spring@Autowired

public class Car
{
    @Autowired
    private Radio radio;

    @Autowired
    private Speaker speaker;

    @Autowired
    private Engine engine;

    private String model;

    public Car createCar()
    {
        radio.add(speaker);
        return this;
    }

    public static class Builder
    {
        private String model;

        public Builder(){}

        public Builder model(String model)
        {
            this.model = model;
            return this;
        }
    }
}
我想用这样的东西

Car car = new Car.Builder().model("A123").build();

这可能吗?

好的,您可以使用类似的方法进行一些基本更改 首先,使用默认的自动连线实例创建汽车和构建器,然后根据需要更改以下示例:

卡尔斯

public class Car {
    private Radio radio;
    private Speaker speaker;
    private Engine engine;

    public Car(Radio radio, Speaker speaker, Engine engine) {
        this.radio = radio;
        this.speaker = speaker;
        this.engine = engine;
    }

    public Radio getRadio() {
        return radio;
    }

    public void setRadio(Radio radio) {
        this.radio = radio;
    }

    public Speaker getSpeaker() {
        return speaker;
    }

    public void setSpeaker(Speaker speaker) {
        this.speaker = speaker;
    }

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }
}
CarBuilder.class

@Component
public class CarBuilder {

    @Autowired
    private Radio radio;
    @Autowired
    private Speaker speaker;
    @Autowired
    private Engine engine;

    public CarBuilder setRadio(Radio radio) {
        this.radio = radio;
        return this;
    }

    public CarBuilder setSpeaker(Speaker speaker) {
        this.speaker = speaker;
        return this;
    }

    public CarBuilder setEngine(Engine engine) {
        this.engine = engine;
        return this;
    }

    public Car createCar() {
        return new Car(radio, speaker, engine);
    }

}
要在代码中使用生成器,如下所示

@Component
public class CarMarket {

    @Autowired
    private CarBuilder carBuilder;

    private Car buildStandardCar(){
        return carBuilder.createCar();
    }


    private Car buildStandardCarButDifferentRadio(Radio radio){
        return carBuilder.setRadio(radio).createCar();
    }

}

我希望这将对您有所帮助:)

我认为这应该有效:

@Component
    public class Car {
@Autowired
private Radio radio;
@Autowired
    private Speaker speaker;
@Autowired
    private Engine engine;  
private String model;
    }
然后是一个生成器类:

    @Component
    public class CarBuilder{
@Autowired
Car car;

public void addModel(String model){
this.car.setModel(model);
}

public Car getCar(){
return car;
}
}
然后是主课

 class Main{

public static void main(String args[]){
     Car car= context.getBean("carBuilder").addModel("abc").getCar();
}
}

当spring为您构建实例时,您为什么要构建实例?因为我希望不断更改一些变量。例如A123型或下次B658型。但是收音机需要扬声器,汽车需要收音机。为什么我们的汽车和CarBuilder有相同的属性?@user3689942如果你是一名汽车装配工,你需要先制造一辆汽车,你将它们分开,然后开始将它们组合在一起,然后再制造汽车。。。这里的关键概念是,我们在构建器中使用它们以提供更大的灵活性构建器最重要的原因之一是促进不可变的实例。如果这是您想要的(根据尊敬的Josh Block和其他许多人的说法,您确实想要它),那么
Car
的私有成员都应该是最终成员,并且
Car
应该没有设置者。为了强制使用生成器,应限制
汽车
构造函数的可见性。如果将
CarBuilder
移动到
Car
内部并使其成为静态内部类,则可以将
Car
的构造函数设置为私有。如果做不到这一点,您至少可以为
汽车的构造函数使用包可见性(未指定
公共
私有
。@n请确定,您所说的是正确的,我100%同意您的意见,但答案是给出一个想法,而不是什么是该模式的最佳实现。。。谢谢:)@MhmdSalem我们还应该努力提供好的使用示例,以免在社区中传播反模式。自动连线注释不需要变异。this.car.setModel(model)!!这是什么!