我見過的大多數 Builder 模式的實作都是這樣的:
https://github.com/Design-pattrns/Builder-Pattern/blob/master/src/Computer.java
基本上,嵌套的構建器類需要鏡像我們構建物件所需的類的所有屬性,然后提供設定所述屬性的方法以及構建器類中的附加 build() 方法。
當我嘗試自己實作 builder 時,我想出了這個(我在 builder 中使用 Person 物件的實體,而不是復制 Person 類的所有屬性)
public class Person {
private String firstName;
private String lastName;
public static class PersonBuilder{
private Person person = new Person();
public PersonBuilder firstName(String firstName){
person.firstName = firstName;
return this;
}
public PersonBuilder lastName(String lastName){
person.lastName = lastName;
return this;
}
public Person build(){
return person;
}
}
}
好處:
1)。不需要重復我們要實體化的類的屬性
2)。build 方法被簡化,只需要回傳 person 物件。
3)。Person 類不需要有一個將 Builder 物件作為引數的建構式
4)。更容易“更新”。如果將新屬性添加到 person 類,我們需要做的就是在需要時在 builder 類中添加 set 方法。無需創建另一個屬性。
缺點:
1)。人物件是渴望初始化的?
那么這個實作有什么問題嗎?
uj5u.com熱心網友回復:
我會說上面的示例“更簡單”,但它沒有構建器提供的任何優勢,并且在需要物件的地方使用新關鍵字并將屬性添加到建構式中可能會更好。我說與構建器相比的缺點如下:
- 它只能創建一個實體
- 一旦構建器“完成”它就可以繼續與物件互動,因為它仍然持有對它的參考。
- 它與它正在“構建”的產品非常緊密地耦合在一起。
- person 類必須將許多屬性公開為對構建器可變的事實,您可能希望在代碼的其他地方不可變。
它實際上更像是一個配置器,我不建議這種模式,但是您可以將要配置的物件傳遞給建構式。在這種情況下,我將創建兩個介面
- 包含設定器的 IConfigurablePerson
- 包括吸氣劑的 IPerson
將配置器 IConfigurablePerson 提供給它的建構式,這樣它就可以訪問設定器,然后將只有 getter 的其他類提供給 IPerson。這提供的優點是它可以與 IConfigurablePerson 的多個實作一起使用,而無需知道它使用的類(解耦)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/414270.html
標籤:
上一篇:這個組合關系的例子是否正確?
