Java中的生成器设计模式
Builder模式在Java中解決了什么問題
正如我之前所說的, Builder模式是一種創新的設計模式,這意味著它可以解決與對象創建有關的問題。 Java中的構造函數用于創建對象,并且可以采用創建對象所需的參數。 問題開始于可以使用許多參數創建對象時,其中一些參數可能是必需的,而其他參數則是可選的 。 考慮一個用于創建Cake的類,現在您需要一些像雞蛋,牛奶,面粉這樣的項目來創建Cake。 它們中的許多是強制性的,其中一些是可選的,例如Cherry,fruits等。如果我們要針對不同種類的蛋糕重載構造函數 ,則將有許多構造函數,甚至更糟的是,它們將接受許多參數。
問題:
1)要維護的構造函數過多。
2)容易出錯,因為許多字段具有相同的類型,例如糖和黃油都放在杯子中,所以如果您傳遞2杯黃油,則代替2杯糖,編譯器不會抱怨,但是會得到幾乎沒有糖的黃油蛋糕,成本很高浪費黃油。
您可以通過創建Cake并添加成分來部分解決此問題,但這會帶來另一個問題,即在構建過程中使Object處于不一致狀態 ,理想情況下,在創建Cake之前,該蛋糕不可用。 這兩個問題都可以通過使用Java中的Builder設計模式來解決。 Builder設計模式不僅可以提高可讀性,而且還可以通過顯式添加成分并使對象在完全構建后可用的方式來減少出錯的機會。
順便說一下,Java中已有許多設計模式教程,例如Java中的 Decorator模式教程和Observer模式 。 如果您還沒有閱讀過,那么值得一讀。
Java中的Builder設計模式示例
我們將使用在Java中使用Builder設計模式創建Cake的相同示例。 在這里,我們在Cake中有一個靜態的嵌套生成器類 ,用于創建對象。
Java Builder設計模式準則
1)在該類中創建一個名為Builder的靜態嵌套類,該類的對象將由Builder生成。 在這個例子中是Cake。
2)Builder類將具有與原始類完全相同的字段集。 3)在本示例中,Builder類將公開添加配料的方法,例如sugar()。 每個方法將返回相同的Builder對象。 每個方法調用都會豐富Builder。
4)Builder.build()方法將所有構建器字段值復制到實際類中并返回Item類的對象。
5)Item類(我們正在為其創建Builder的類)應具有私有構造函數,以通過build()方法創建其對象,并防止外部人員訪問其構造函數。
public class BuilderPatternExample {public static void main(String args[]) {//Creating object using Builder pattern in javaCake whiteCake = new Cake.Builder().sugar(1).butter(0.5). eggs(2).vanila(2).flour(1.5). bakingpowder(0.75).milk(0.5).build();//Cake is ready to eat :)System.out.println(whiteCake);} }class Cake {private final double sugar; //cupprivate final double butter; //cupprivate final int eggs;private final int vanila; //spoonprivate final double flour; //cupprivate final double bakingpowder; //spoonprivate final double milk; //cupprivate final int cherry;public static class Builder {private double sugar; //cupprivate double butter; //cupprivate int eggs;private int vanila; //spoonprivate double flour; //cupprivate double bakingpowder; //spoonprivate double milk; //cupprivate int cherry;//builder methods for setting propertypublic Builder sugar(double cup){this.sugar = cup; return this; }public Builder butter(double cup){this.butter = cup; return this; }public Builder eggs(int number){this.eggs = number; return this; }public Builder vanila(int spoon){this.vanila = spoon; return this; }public Builder flour(double cup){this.flour = cup; return this; }public Builder bakingpowder(double spoon){this.sugar = spoon; return this; }public Builder milk(double cup){this.milk = cup; return this; }public Builder cherry(int number){this.cherry = number; return this; }//return fully build objectpublic Cake build() {return new Cake(this);}}//private constructor to enforce object creation through builderprivate Cake(Builder builder) {this.sugar = builder.sugar;this.butter = builder.butter;this.eggs = builder.eggs;this.vanila = builder.vanila;this.flour = builder.flour;this.bakingpowder = builder.bakingpowder;this.milk = builder.milk;this.cherry = builder.cherry; }@Overridepublic String toString() {return "Cake{" + "sugar=" + sugar + ", butter=" + butter + ", eggs=" + eggs + ", vanila=" + vanila + ", flour=" + flour + ", bakingpowder=" + bakingpowder + ", milk=" + milk + ", cherry=" + cherry + '}';} }輸出:
Cake{sugar=0.75, butter=0.5, eggs=2, vanila=2, flour=1.5, bakingpowder=0.0, milk=0.5, cherry=0}Java中的生成器設計模式–優點和缺點
充分利用Builder模式也有一些缺點,但是如果您查看下面的內容,優點顯然超過了Builder設計模式的缺點。 無論如何,這里都沒有使用Java創建對象的Builder設計模式的優缺點。
優點:
1)如果創建對象所需的字段數大于4或5,則更具維護性。
2)不太容易出錯,因為由于顯式方法調用,用戶將知道他們正在傳遞的內容。
3)更健壯,因為只有完全構造的對象可供客戶端使用。
缺點: 1)冗長且代碼重復,因為Builder需要從Original或Item類復制所有字段。
何時在Java中使用Builder Design模式? Builder模式是一種創建模式,當構造函數中所需的參數數量通常大于4或最多5時,應使用該模式。不要與Builder和Factory模式混淆。 Builder和Factory模式之間的區別,因為Factory可以用來創建同一接口的不同實現,但是Builder與其Container類綁定在一起,并且僅返回Outer類的對象。
這就是Java中的Builder設計模式 。 我們已經了解了為什么需要構建器模式,解決了什么問題,Java中的構建器設計模式示例以及最終何時使用構建器模式的優缺點。 因此,如果您不使用伸縮構造函數模式,或者選擇不使用它,那么可以使用Builder模式。
??
參考: Java中的構建器設計模式– JCG合作伙伴 Javin Paul在Javarevisited博客上的示例教程 。
翻譯自: https://www.javacodegeeks.com/2012/07/builder-design-pattern-in-java.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Java中的生成器设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaFX 2.0布局窗格– HBox
- 下一篇: 如何将路由器设置成内网映射联通路由器如何