java 生成器 设计模式_Java中的生成器设计模式
java 生成器 設(shè)計(jì)模式
Java 中的 Builder設(shè)計(jì)模式是一種創(chuàng)建模式,即用于創(chuàng)建對象,類似于 工廠方法設(shè)計(jì)模式 ,這也是創(chuàng)建設(shè)計(jì)模式。 在學(xué)習(xí)任何設(shè)計(jì)模式之前,我建議先找出特定設(shè)計(jì)模式要解決的問題。 眾所周知, 必要性是發(fā)明的母親。 在沒有面臨問題的情況下學(xué)習(xí)設(shè)計(jì)模式并不是那么有效,相反,如果您已經(jīng)面臨問題,那么它比起易于理解的設(shè)計(jì)模式并學(xué)習(xí)如何解決問題就容易得多。 在此Java設(shè)計(jì)模式教程中,我們將首先看到 Builder設(shè)計(jì)模式 解決了 哪些問題 ,這將使您對 何時在Java中使用Builder設(shè)計(jì)模式 有一些見識 , 這也是一個 流行的設(shè)計(jì)模式訪談問題 ,然后我們將看到Builder設(shè)計(jì)模式的示例。在Java中使用Builder模式的優(yōu)缺點(diǎn)。Builder模式在Java中解決了什么問題
正如我之前所說的, Builder模式是一種創(chuàng)造性的設(shè)計(jì)模式,這意味著它可以解決與對象創(chuàng)建相關(guān)的問題。 Java中的構(gòu)造函數(shù)用于創(chuàng)建對象,并且可以采用創(chuàng)建對象所需的參數(shù)。 問題始于可以使用許多參數(shù)創(chuàng)建對象時,其中一些參數(shù)可能是必需的,而其他參數(shù)則是可選的 。 考慮一個用于創(chuàng)建Cake的類,現(xiàn)在您需要一些像雞蛋,牛奶,面粉這樣的項(xiàng)目來創(chuàng)建Cake。 其中許多是強(qiáng)制性的,而某些則是可選的,例如Cherry,fruits等。如果我們要為不同種類的蛋糕重載構(gòu)造函數(shù) ,則將有許多構(gòu)造函數(shù),甚至最差的情況是,它們將接受許多參數(shù)。
問題:
1)要維護(hù)的構(gòu)造函數(shù)太多。
2)容易出錯,因?yàn)樵S多字段具有相同的類型,例如糖和黃油都放在杯子中,所以如果您傳遞2杯黃油,則代替2杯糖,編譯器不會抱怨,但是會得到幾乎沒有糖的黃油蛋糕,成本很高浪費(fèi)黃油。
您可以通過創(chuàng)建Cake并添加配料來部分解決此問題,但這會帶來另一個問題,即在構(gòu)建過程中使Object處于不一致狀態(tài) ,理想情況下,cake在創(chuàng)建之前不可用。 這兩個問題都可以通過使用Java中的Builder設(shè)計(jì)模式來解決。 Builder設(shè)計(jì)模式不僅可以提高可讀性,而且還可以通過顯式添加成分并使對象在完全構(gòu)建后可用的方式來減少出錯的機(jī)會。
順便說一下,Java中已有許多設(shè)計(jì)模式教程,例如Java中的 Decorator模式教程和Observer模式 。 如果您還沒有閱讀過,那么值得一讀。
Java中的Builder設(shè)計(jì)模式示例
我們將使用在Java中使用Builder設(shè)計(jì)模式創(chuàng)建Cake的相同示例。 在這里,我們在Cake中有一個靜態(tài)的嵌套生成器類 ,用于創(chuàng)建對象。
Java Builder設(shè)計(jì)模式準(zhǔn)則
1)在該類中創(chuàng)建一個稱為Builder的靜態(tài)嵌套類,該類的對象將由Builder生成。 在此示例中,它是Cake。
2)Builder類將具有與原始類完全相同的字段集。 3)在此示例中,Builder類將公開添加配料的方法,例如sugar()。 每個方法將返回相同的Builder對象。 每個方法調(diào)用都會豐富Builder。
4)Builder.build()方法會將所有構(gòu)建器字段值復(fù)制到實(shí)際類中并返回Item類的對象。
5)Item類(我們正在為其創(chuàng)建Builder的類)應(yīng)具有私有構(gòu)造函數(shù),以通過build()方法創(chuàng)建其對象,并防止外部人員訪問其構(gòu)造函數(shù)。
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中的生成器設(shè)計(jì)模式–優(yōu)點(diǎn)和缺點(diǎn)
充分利用Builder模式也有一些缺點(diǎn),但是如果您查看下面的內(nèi)容,優(yōu)點(diǎn)顯然超過了Builder設(shè)計(jì)模式的缺點(diǎn)。 無論如何,這里都沒有使用Java創(chuàng)建對象的Builder設(shè)計(jì)模式的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):
1)如果創(chuàng)建對象所需的字段數(shù)大于4或5,則更具維護(hù)性。
2)不太容易出錯,因?yàn)橛捎陲@式方法調(diào)用,用戶將知道他們正在傳遞的內(nèi)容。
3)更健壯,因?yàn)橹挥型耆珮?gòu)造的對象可供客戶端使用。
缺點(diǎn): 1)冗長和代碼重復(fù),因?yàn)锽uilder需要從Original或Item類復(fù)制所有字段。
何時在Java中使用Builder Design模式? Builder模式是一種創(chuàng)建模式,當(dāng)構(gòu)造函數(shù)中所需的參數(shù)數(shù)量通常大于4或最多不超過5時,應(yīng)使用該模式。不要與Builder和Factory模式混淆。 Builder和Factory模式之間的區(qū)別,因?yàn)镕actory可以用于創(chuàng)建同一接口的不同實(shí)現(xiàn),但是Builder與其Container類綁定在一起,并且僅返回Outer類的對象。
這就是Java中的Builder設(shè)計(jì)模式 。 我們已經(jīng)了解了為什么需要構(gòu)建器模式,解決了什么問題,Java中的構(gòu)建器設(shè)計(jì)模式示例以及最終何時使用構(gòu)建器模式的優(yōu)缺點(diǎn)。 因此,如果您不使用伸縮構(gòu)造函數(shù)模式,或者選擇不使用它,則可以選擇Builder模式。
??
參考: Java中的構(gòu)建器設(shè)計(jì)模式– JCG合作伙伴 Javin Paul在Javarevisited博客上的示例教程 。
翻譯自: https://www.javacodegeeks.com/2012/07/builder-design-pattern-in-java.html
java 生成器 設(shè)計(jì)模式
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的java 生成器 设计模式_Java中的生成器设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑acpi怎么禁用(电脑acpi怎么关
- 下一篇: oppo手机通话挂机设置(oppo挂机模