2016-09-28 71 views
1

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

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(); 

这可能吗?

+0

为什么你想建立实例,当春天为你做? – kuhajeyan

+0

因为有一些变量我想继续改变。例如型号A123或下一次B658。但无线电需要扬声器和汽车需要无线电。 – user293655

回答

0

OK后,可使用一些基本的变化 类似的东西首先你要汽车,使用默认的建设者自动装配的实例,那么你只要你想在这里的例子修改:

Car.calss

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(); 
    } 

} 

我希望这将帮助你:)

+0

为什么我们在Car和CarBuilder中有相同的属性? –

+0

@ user3689942如果你是一个汽车装配商,并且你需要先建立一辆汽车,然后你开始将它们结合在一起,那么你就可以建造汽车......这里的关键概念是,我们让他们在建造者身上更灵活 –

+1

建设者最重要的原因之一是促进不可变的实例。如果这就是你想要的(根据尊敬的乔希布洛克和其他许多人的说法,你会*要*),那么'Car'的私人成员应该都是最终的,'Car'应该没有任何制定者。为了强制使用构建器,Car的构造函数的可见性应该是有限的。如果你将'CarBuilder'移动到'Car'中,并将其设置为静态内部类,则可以使'Car'的构造函数为私有。如果不这样做,你至少可以使用包的可见性(没有指定'public'或'private')Car的构造函数。 – nclark

-1

我认为这应该工作:

@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(); 
} 
} 
+0

这会增加编译错误,您的汽车类别中没有增变器... –

+0

使用Autowired注释时不需要增变器。 –

+0

this.car.setModel(model); !这是什么! –