閱讀GoF,在我看來,抽象工廠和構建器之間的唯一區別在於後者有一個額外的抽象層來隱藏客戶端的實現。但應該有更多的東西,對吧?如果我們正在處理圖形,那麼構建器應該會更有用,但爲什麼?設計模式 - 在構建器和抽象工廠之間進行選擇
我剛剛進入這個東西,所以如果有人可以請給我一些「建設者vs抽象工廠」的情況下,它將不勝感激。
閱讀GoF,在我看來,抽象工廠和構建器之間的唯一區別在於後者有一個額外的抽象層來隱藏客戶端的實現。但應該有更多的東西,對吧?如果我們正在處理圖形,那麼構建器應該會更有用,但爲什麼?設計模式 - 在構建器和抽象工廠之間進行選擇
我剛剛進入這個東西,所以如果有人可以請給我一些「建設者vs抽象工廠」的情況下,它將不勝感激。
您可以將Builder
想象成一種構造函數,它不會將所有輸入參數同時提供給構造函數,而是可以將所有參數延遲到稍後。這對於隨着時間的推移構建對象或將Builder實例傳遞給其他對象或方法以使它們可以添加它們的參數等非常有用。一旦添加了所有參數,則調用構建器的方法build()
就會創建恰好一個構建對象的實例。再次調用build()
將根據構建器的實現創建另一個相同的實例或拋出錯誤。
在Java中,StringBuilder
是一個常見的Builder示例。 StringBuilders讓你隨着時間的推移追加/插入/刪除字符或其他字符串。然後當你完成構建字符串時,調用StringBuilder.toString()
將只創建一個新的String對象。這比連接多個Stings效率更高效,其中每個Java String連接將創建一個新的String實例。
AbstractFactory
模式用於創建不同的Factory
類,其中每個工廠實例可以創建多個不同類型的對象。 Java中的AbstractFactory示例是JDBC類。 JDBC DriverManager
類是一個抽象工廠,它創建與數據庫連接的不同Connection
實例。其中Connection
實例返回取決於您正在使用哪個數據庫以及您已註冊了哪些驅動程序。 Connection
類是Factory
,它允許您創建不同種類的Statement
對象,具體取決於您給它的參數值。
Statement statement = myConnection.createStatement(sqlString);
Statement otherStatement = myConnection.createStatement(differentSqlString);
Builder的示例:java.lang.StringBuilder。抽象工廠的示例:javax.xml.parsers.DocumentBuilderFactory#newInstance()。這兩種模式不能解決同樣的問題。 Builder幫助從各個部分創建一個複雜的,通常是不可變的對象。抽象工廠允許根據配置參數創建抽象基類的適當子類的實例。 –
剛剛在網絡上發現了這個主要區別: 抽象工廠:專注於定義許多不同類型的*工廠*以構建許多*產品*,並且它不僅僅是一個產品的一個建造者--- 生成器:專注於建立一個複雜但只有一個*產品* – Andrew