2016-09-28 68 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); !這是什麼! –