2013-04-27 40 views
4

我正在考慮使用builder pattern以在我的應用程序中創建複雜的objects。不過,我擔心這是否是正確的使用模式。正確使用生成器模式

this example;在這裏我們看到幾個具體PizzaBuilders正在創建,很好地工作。但是,在我的應用程序中,我需要能夠傳遞與正在構建的內容有關的一些信息。例如,在PizzaBuilders的情況下,我需要能夠創建custom pizza,用戶可以選擇某些東西,如saucetoppings。值得注意的是,我需要傳遞給建設者的信息會有所不同。

請你能建議我是否正在尋找使用正確的模式解決這個問題,或者是否有其他更適合的方法?如果這是問題的正確模式,那麼請您建議您使用最簡潔的方式將信息傳遞給建設者?它會在實例化的地步嗎?

回答

2

聽起來像生成器模式是你所需要的。在那篇維基百科文章中,我們可以看到不同的預定義構建器。但是,這不是使用Builder模式的唯一方法。

你當然可以用它創建自定義對象,它的一個優點是它允許你自動創建複雜對象,而無需定義多個構造器,這導致了更多的可支持代碼。請記住,如果沒有足夠的複雜性來保證使用這種模式,它可能是矯枉過正的。

請看一下在Joshua Bloch的Effective Java中提供的這種模式的描述,以獲得更全面的解釋。 Here's an article about it

0

Builder is not a grade A pattern, so it's tough to justify its usage sometime. And you might not find convincing reason to use it.

如果你想確保你的目標是建造原子它的使用。考慮使用setter方法構造bean對象的Java方法。在這種情況下,問題在於,如果您錯過了設置一個屬性,那麼對象將不會處於一致的狀態。除非你得到一些不一致的應用程序行爲,否則沒有辦法解決這個問題。

所以你應該使用Builder模式,當有像3個屬性,你想創建對象的原子。我曾經使用過它來創建REST url,如BASE_URL/param1/param2/param3

因此,如果您的需求是關於創建/建立一個對象,並且您有多個屬性,那麼您可以選擇這種模式。

編輯

關於執行;我遵循了與維基百科上給出的相同的方法。

2

例如,在PizzaBuilders的情況下,我需要創建一個自定義的比薩餅,用戶可以選擇某些東西,如醬和澆頭

可以選擇的能力 - 這些意味着可選元素。 Builder模式在這裏是完美的。 除非你在你的問題中省略了一些東西。

2

我想你可以使用類似:

// normal pizza: 
Pizza normalPizza=PizzaBuilder.aPizza().withCheese().withSalami().build(); 

// custom pizza 
Pizza customPizza=PizzaBuilder.aCustomPizza().withAnchovis().withHotSauce().withExtraCheese().withoutGarlic().build(); 

什麼建設者將在內部做的是到執行,只要建立()返回一個比薩對象(或合適的子類)。您還可以在with ...方法或build()中進行任何一致性檢查。

如果您需要Typesafety的結果,您可以使用buildCustomPizza()來返回您的自定義比薩類型。