日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java中的生成器设计模式

發(fā)布時(shí)間:2023/12/3 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的生成器设计模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java 中的 Builder設(shè)計(jì)模式是一種創(chuàng)建模式,即用于創(chuàng)建對(duì)象,類似于 工廠方法設(shè)計(jì)模式 ,這也是創(chuàng)建設(shè)計(jì)模式。 在學(xué)習(xí)任何設(shè)計(jì)模式之前,我建議先找出特定設(shè)計(jì)模式要解決的問(wèn)題。 眾所周知, 必要性是發(fā)明的母親。 在沒(méi)有面臨問(wèn)題的情況下學(xué)習(xí)設(shè)計(jì)模式并不是那么有效,相反,如果您已經(jīng)面臨問(wèn)題,那么它比起易于理解的設(shè)計(jì)模式并學(xué)習(xí)如何解決問(wèn)題就容易得多。 在本Java設(shè)計(jì)模式教程中,我們將首先看到 Builder設(shè)計(jì)模式 解決了 哪些問(wèn)題 ,這將為 何時(shí)使用Java中的 Builder設(shè)計(jì)模式 提供一些見(jiàn)解 , 這也是一個(gè) 流行的設(shè)計(jì)模式訪談問(wèn)題 ,然后我們將看到Builder設(shè)計(jì)模式的示例。在Java中使用Builder模式的利弊。

Builder模式在Java中解決了什么問(wèn)題

正如我之前所說(shuō)的, Builder模式是一種創(chuàng)新的設(shè)計(jì)模式,這意味著它可以解決與對(duì)象創(chuàng)建有關(guān)的問(wèn)題。 Java中的構(gòu)造函數(shù)用于創(chuàng)建對(duì)象,并且可以采用創(chuàng)建對(duì)象所需的參數(shù)。 問(wèn)題開始于可以使用許多參數(shù)創(chuàng)建對(duì)象時(shí),其中一些參數(shù)可能是必需的,而其他參數(shù)則是可選的 。 考慮一個(gè)用于創(chuàng)建Cake的類,現(xiàn)在您需要一些像雞蛋,牛奶,面粉這樣的項(xiàng)目來(lái)創(chuàng)建Cake。 它們中的許多是強(qiáng)制性的,其中一些是可選的,例如Cherry,fruits等。如果我們要針對(duì)不同種類的蛋糕重載構(gòu)造函數(shù) ,則將有許多構(gòu)造函數(shù),甚至更糟的是,它們將接受許多參數(shù)。

問(wèn)題:

1)要維護(hù)的構(gòu)造函數(shù)過(guò)多。

2)容易出錯(cuò),因?yàn)樵S多字段具有相同的類型,例如糖和黃油都放在杯子中,所以如果您傳遞2杯黃油,則代替2杯糖,編譯器不會(huì)抱怨,但是會(huì)得到幾乎沒(méi)有糖的黃油蛋糕,成本很高浪費(fèi)黃油。

您可以通過(guò)創(chuàng)建Cake并添加成分來(lái)部分解決此問(wèn)題,但這會(huì)帶來(lái)另一個(gè)問(wèn)題,即在構(gòu)建過(guò)程中使Object處于不一致狀態(tài) ,理想情況下,在創(chuàng)建Cake之前,該蛋糕不可用。 這兩個(gè)問(wèn)題都可以通過(guò)使用Java中的Builder設(shè)計(jì)模式來(lái)解決。 Builder設(shè)計(jì)模式不僅可以提高可讀性,而且還可以通過(guò)顯式添加成分并使對(duì)象在完全構(gòu)建后可用的方式來(lái)減少出錯(cuò)的機(jī)會(huì)。

順便說(shuō)一下,Java中已有許多設(shè)計(jì)模式教程,例如Java中的 Decorator模式教程和Observer模式 。 如果您還沒(méi)有閱讀過(guò),那么值得一讀。

Java中的Builder設(shè)計(jì)模式示例

我們將使用在Java中使用Builder設(shè)計(jì)模式創(chuàng)建Cake的相同示例。 在這里,我們?cè)贑ake中有一個(gè)靜態(tài)的嵌套生成器類 ,用于創(chuàng)建對(duì)象。

Java Builder設(shè)計(jì)模式準(zhǔn)則

1)在該類中創(chuàng)建一個(gè)名為Builder的靜態(tài)嵌套類,該類的對(duì)象將由Builder生成。 在這個(gè)例子中是Cake。

2)Builder類將具有與原始類完全相同的字段集。 3)在本示例中,Builder類將公開添加配料的方法,例如sugar()。 每個(gè)方法將返回相同的Builder對(duì)象。 每個(gè)方法調(diào)用都會(huì)豐富Builder。

4)Builder.build()方法將所有構(gòu)建器字段值復(fù)制到實(shí)際類中并返回Item類的對(duì)象。

5)Item類(我們正在為其創(chuàng)建Builder的類)應(yīng)具有私有構(gòu)造函數(shù),以通過(guò)build()方法創(chuàng)建其對(duì)象,并防止外部人員訪問(wèn)其構(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)顯然超過(guò)了Builder設(shè)計(jì)模式的缺點(diǎn)。 無(wú)論如何,這里都沒(méi)有使用Java創(chuàng)建對(duì)象的Builder設(shè)計(jì)模式的優(yōu)缺點(diǎn)。

優(yōu)點(diǎn):

1)如果創(chuàng)建對(duì)象所需的字段數(shù)大于4或5,則更具維護(hù)性。


2)不太容易出錯(cuò),因?yàn)橛捎陲@式方法調(diào)用,用戶將知道他們正在傳遞的內(nèi)容。
3)更健壯,因?yàn)橹挥型耆珮?gòu)造的對(duì)象可供客戶端使用。

缺點(diǎn): 1)冗長(zhǎng)且代碼重復(fù),因?yàn)锽uilder需要從Original或Item類復(fù)制所有字段。

何時(shí)在Java中使用Builder Design模式? Builder模式是一種創(chuàng)建模式,當(dāng)構(gòu)造函數(shù)中所需的參數(shù)數(shù)量通常大于4或最多5時(shí),應(yīng)使用該模式。不要與Builder和Factory模式混淆。 Builder和Factory模式之間的區(qū)別,因?yàn)镕actory可以用來(lái)創(chuàng)建同一接口的不同實(shí)現(xiàn),但是Builder與其Container類綁定在一起,并且僅返回Outer類的對(duì)象。

這就是Java中的Builder設(shè)計(jì)模式 。 我們已經(jīng)了解了為什么需要構(gòu)建器模式,解決了什么問(wèn)題,Java中的構(gòu)建器設(shè)計(jì)模式示例以及最終何時(shí)使用構(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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Java中的生成器设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。