最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java通俗易懂系列設(shè)計(jì)模式之建造者模式

 更新時(shí)間:2021年04月23日 10:11:48   作者:JaJian  
這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之建造者模式,對(duì)設(shè)計(jì)模式感興趣的讀者,一定要看一下

介紹

今天我們將研究java中的Builder模式。Builder 設(shè)計(jì)模式是一種創(chuàng)造性的設(shè)計(jì)模式,如工廠模式和抽象工廠模式。
當(dāng)Object包含許多屬性時(shí),引入了Builder模式來解決Factory和Abstract Factory設(shè)計(jì)模式的一些問題。
當(dāng)Object包含許多屬性時(shí),F(xiàn)actory和Abstract Factory設(shè)計(jì)模式存在三個(gè)主要問題。

  1. 從客戶端程序傳遞到Factory類的參數(shù)太多,可能容易出錯(cuò),因?yàn)榇蠖鄶?shù)情況下,參數(shù)的類型是相同的,而從客戶端來說,很難維護(hù)參數(shù)的順序。
  2. 一些參數(shù)可能是可選的,但在Factory模式中,我們被迫發(fā)送所有需要發(fā)送為NULL的參數(shù)和可選參數(shù)。
  3. 如果對(duì)象很重并且它的創(chuàng)建很復(fù)雜,那么所有這些復(fù)雜性都將成為Factory類的一部分,令人困惑。

我們可以通過提供具有所需參數(shù)的構(gòu)造函數(shù)然后使用不同的setter方法來設(shè)置可選參數(shù)來解決大量參數(shù)的問題。這種方法的問題是,除非明確設(shè)置所有屬性,否則Object狀態(tài)將不一致。

Builder模式通過提供逐步構(gòu)建對(duì)象的方法并提供實(shí)際返回最終Object的方法,解決了大量可選參數(shù)和不一致狀態(tài)的問題。

意圖

將復(fù)雜對(duì)象的構(gòu)造與其表示分開,以便相同的構(gòu)造過程可以創(chuàng)建不同的表示。

定義

現(xiàn)實(shí)世界的例子:

想象一下角色扮演游戲的角色生成器。最簡(jiǎn)單的選擇是讓計(jì)算機(jī)為您創(chuàng)建角色。但是如果你想選擇職業(yè),性別,頭發(fā)顏色等角色細(xì)節(jié),那么角色生成將成為一個(gè)循序漸進(jìn)的過程,在所有選擇準(zhǔn)備就緒時(shí)完成。

簡(jiǎn)單來說:

允許您創(chuàng)建不同風(fēng)格的對(duì)象,同時(shí)避免構(gòu)造函數(shù)被污染。當(dāng)有幾種不同的構(gòu)造函數(shù)時(shí)很有用。或者在創(chuàng)建對(duì)象時(shí)涉及很多步驟。

維基百科說:

構(gòu)建器模式是對(duì)象創(chuàng)建軟件設(shè)計(jì)模式,其目的是找到伸縮構(gòu)造器反模式的解決方案。

話雖如此,讓我補(bǔ)充說一下伸縮構(gòu)造器反模式是什么。某時(shí)某刻,我們都會(huì)看到如下構(gòu)造函數(shù):

public Hero(Profession profession, String name, HairType hairType, HairColor hairColor, Armor armor, Weapon weapon) {
}

正如您所看到的,構(gòu)造函數(shù)參數(shù)的數(shù)量很快就會(huì)失控,并且可能很難理解參數(shù)的排列。此外,如果您希望將來添加更多選項(xiàng),此參數(shù)列表可能會(huì)繼續(xù)增長(zhǎng)。這就被稱為"the telescoping constructor anti-pattern"(可伸縮構(gòu)造器的反模式)。

理智的替代方案是使用Builder模式。

實(shí)例

讓我們看看如何在java中實(shí)現(xiàn)構(gòu)建器設(shè)計(jì)模式。

  • 首先,您需要?jiǎng)?chuàng)建一個(gè)靜態(tài)嵌套類,然后將所有參數(shù)從外部類復(fù)制到Builder類。我們應(yīng)該遵循命名約定,如果類名是Computer那么構(gòu)建器類應(yīng)該命名為ComputerBuilder。
  • Java Builder類應(yīng)該有一個(gè)公共構(gòu)造函數(shù),其中包含所有必需的屬性作為參數(shù)。
  • Java Builder類應(yīng)具有設(shè)置可選參數(shù)的方法,并且應(yīng)在設(shè)置可選屬性后返回相同的Builder對(duì)象。
  • 最后一步是build()在構(gòu)建器類中提供一個(gè)方法,該方法將返回客戶端程序所需的Object。為此,我們需要在Class中使用Builder類作為參數(shù)的私有構(gòu)造函數(shù)。

下面是示例構(gòu)建器模式示例代碼,首先,我們有我們想要?jiǎng)?chuàng)造的英雄

public final class Hero {
  private final Profession profession;
  private final String name;
  private final HairType hairType;
  private final HairColor hairColor;
  private final Armor armor;
  private final Weapon weapon;

  private Hero(Builder builder) {
    this.profession = builder.profession;
    this.name = builder.name;
    this.hairColor = builder.hairColor;
    this.hairType = builder.hairType;
    this.weapon = builder.weapon;
    this.armor = builder.armor;
  }
}

然后我們有了建設(shè)者

public static class HeroBuilder {
    private final Profession profession;
    private final String name;
    private HairType hairType;
    private HairColor hairColor;
    private Armor armor;
    private Weapon weapon;

    public Builder(Profession profession, String name) {
      if (profession == null || name == null) {
        throw new IllegalArgumentException("profession and name can not be null");
      }
      this.profession = profession;
      this.name = name;
    }

    public Builder withHairType(HairType hairType) {
      this.hairType = hairType;
      return this;
    }

    public Builder withHairColor(HairColor hairColor) {
      this.hairColor = hairColor;
      return this;
    }

    public Builder withArmor(Armor armor) {
      this.armor = armor;
      return this;
    }

    public Builder withWeapon(Weapon weapon) {
      this.weapon = weapon;
      return this;
    }

    public Hero build() {
      return new Hero(this);
    }
  }

請(qǐng)注意,Hero類只有g(shù)etter方法,沒有公共構(gòu)造函數(shù)。因此,獲取Hero對(duì)象的唯一方法是通過HeroBuilder類。

然后它可以用作如下,顯示如何使用Builder類來獲取對(duì)象:

Hero mage = new Hero.HeroBuilder(Profession.MAGE, "Riobard").withHairColor(HairColor.BLACK).withWeapon(Weapon.DAGGER).build();

使用場(chǎng)景

使用Builder模式時(shí)

  • 用于創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于構(gòu)成對(duì)象的部分以及它們?nèi)绾谓M裝
  • 構(gòu)造過程必須允許對(duì)構(gòu)造的對(duì)象進(jìn)行不同的表示

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

Java類中的一些構(gòu)建器模式示例是;

  • java.lang.StringBuilder#append()(未同步)
  • java.lang.StringBuffer#append()(synchronized)

總結(jié)

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

  • 建造者獨(dú)立,易擴(kuò)展。
  • 便于控制細(xì)節(jié)風(fēng)險(xiǎn)。

缺點(diǎn):

  • 產(chǎn)品必須有共同點(diǎn),范圍有限制。
  • 如內(nèi)部變化復(fù)雜,會(huì)有很多的建造類。

注意事項(xiàng):

與工廠模式的區(qū)別是:建造者模式更加關(guān)注與零件裝配的順序。

以上就是Java通俗易懂系列設(shè)計(jì)模式之建造者模式的詳細(xì)內(nèi)容,更多關(guān)于Java設(shè)計(jì)模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Spring Security中獲取當(dāng)前登錄用戶的詳細(xì)信息的幾種方法

    詳解Spring Security中獲取當(dāng)前登錄用戶的詳細(xì)信息的幾種方法

    本文主要介紹了詳解Spring Security中獲取當(dāng)前登錄用戶的詳細(xì)信息的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Spring Boot整合mybatis使用注解實(shí)現(xiàn)動(dòng)態(tài)Sql、參數(shù)傳遞等常用操作(實(shí)現(xiàn)方法)

    Spring Boot整合mybatis使用注解實(shí)現(xiàn)動(dòng)態(tài)Sql、參數(shù)傳遞等常用操作(實(shí)現(xiàn)方法)

    這篇文章主要介紹了Spring Boot整合mybatis使用注解實(shí)現(xiàn)動(dòng)態(tài)Sql、參數(shù)傳遞等常用操作(實(shí)現(xiàn)方法),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java如何獲取一個(gè)隨機(jī)數(shù) Java猜數(shù)字小游戲

    Java如何獲取一個(gè)隨機(jī)數(shù) Java猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了Java如何獲取一個(gè)隨機(jī)數(shù),類似猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Java?Optional用法面試題精講

    Java?Optional用法面試題精講

    這篇文章主要為大家介紹了Java?Optional用法面試題精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java中數(shù)組協(xié)變和范型不變性踩坑記錄

    Java中數(shù)組協(xié)變和范型不變性踩坑記錄

    數(shù)組的協(xié)變性來源于數(shù)組的一個(gè)優(yōu)勢(shì),這篇文章主要給大家介紹了關(guān)于Java中數(shù)組協(xié)變和范型不變性踩坑的一些內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • SpringBoot配置log4j2的實(shí)現(xiàn)示例

    SpringBoot配置log4j2的實(shí)現(xiàn)示例

    SpringBoot中默認(rèn)使用Logback作為日志框架,本文主要介紹了SpringBoot配置log4j2的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • slf4j?jcl?jul?log4j1?log4j2?logback各組件系統(tǒng)日志切換

    slf4j?jcl?jul?log4j1?log4j2?logback各組件系統(tǒng)日志切換

    這篇文章主要介紹了slf4j、jcl、jul、log4j1、log4j2、logback的大總結(jié),各個(gè)組件的jar包以及目前系統(tǒng)日志需要切換實(shí)現(xiàn)方式的方法,有需要的朋友可以借鑒參考下
    2022-03-03
  • 基于JPA的Repository使用詳解

    基于JPA的Repository使用詳解

    這篇文章主要介紹了JPA的Repository使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • mybatis-plus開啟sql打印的三種方式總結(jié)

    mybatis-plus開啟sql打印的三種方式總結(jié)

    這篇文章主要給大家介紹了mybatisplus開啟sql打印的三種方式,文章通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)大數(shù)運(yùn)算的實(shí)例代碼

    Java實(shí)現(xiàn)大數(shù)運(yùn)算的實(shí)例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)大數(shù)運(yùn)算的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06

最新評(píng)論

鄂托克旗| 尚义县| 昭觉县| 浪卡子县| 新河县| 尼木县| 准格尔旗| 南木林县| 桃园县| 磐安县| 屏东市| 南康市| 赣州市| 临朐县| 廉江市| 灵山县| 保靖县| 泽库县| 酒泉市| 武邑县| 武威市| 专栏| 新竹县| 留坝县| 蓬溪县| 秭归县| 哈尔滨市| 新野县| 怀安县| 杂多县| 揭阳市| 平阳县| 武邑县| 丰顺县| 岳西县| 竹北市| 万安县| 肇州县| 遵义市| 额尔古纳市| 科技|