欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java通俗易懂系列設計模式之建造者模式

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

介紹

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

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

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

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

意圖

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

定義

現實世界的例子:

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

簡單來說:

允許您創(chuàng)建不同風格的對象,同時避免構造函數被污染。當有幾種不同的構造函數時很有用?;蛘咴趧?chuàng)建對象時涉及很多步驟。

維基百科說:

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

話雖如此,讓我補充說一下伸縮構造器反模式是什么。某時某刻,我們都會看到如下構造函數:

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

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

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

實例

讓我們看看如何在java中實現構建器設計模式。

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

下面是示例構建器模式示例代碼,首先,我們有我們想要創(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;
  }
}

然后我們有了建設者

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);
    }
  }

請注意,Hero類只有getter方法,沒有公共構造函數。因此,獲取Hero對象的唯一方法是通過HeroBuilder類。

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

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

使用場景

使用Builder模式時

  • 用于創(chuàng)建復雜對象的算法應該獨立于構成對象的部分以及它們如何組裝
  • 構造過程必須允許對構造的對象進行不同的表示

JDK中的Builder設計模式示例

Java類中的一些構建器模式示例是;

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

總結

優(yōu)點:

  • 建造者獨立,易擴展。
  • 便于控制細節(jié)風險。

缺點:

  • 產品必須有共同點,范圍有限制。
  • 如內部變化復雜,會有很多的建造類。

注意事項:

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

以上就是Java通俗易懂系列設計模式之建造者模式的詳細內容,更多關于Java設計模式的資料請關注腳本之家其它相關文章!

相關文章

  • Java8新特性-Lambda表達式詳解

    Java8新特性-Lambda表達式詳解

    Java 8 (又稱為 jdk 1.8) 是 Java 語言開發(fā)的一個主要版本。Lambda 表達式,也可稱為閉包,它是推動 Java 8 發(fā)布的最重要新特性。本文通過詳細的代碼示例介紹了Java8新特性感興趣的朋友可以參考一下
    2023-04-04
  • Java前后端時間格式的轉化方式

    Java前后端時間格式的轉化方式

    這篇文章主要介紹了Java前后端時間格式的轉化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Android bdflow數據庫神器的使用

    Android bdflow數據庫神器的使用

    這篇文章主要介紹了Android bdflow數據庫神器的使用,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • WebClient拋UnsupportedMediaTypeException異常解決

    WebClient拋UnsupportedMediaTypeException異常解決

    這篇文章主要為大家介紹了WebClient拋UnsupportedMediaTypeException異常的解決方案,文中給大家介紹了六中方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • 總結Java集合類操作優(yōu)化經驗

    總結Java集合類操作優(yōu)化經驗

    本文主要介紹的就是集合框架的使用經驗,告訴大家如何高效、方便地管理對象,所有代碼基于JDK7,需要的朋友可以參考下
    2015-08-08
  • 從Myeclipse 導入到eclipse中無法識別為 web項目 問題的解決步驟

    從Myeclipse 導入到eclipse中無法識別為 web項目 問題的解決步驟

    這篇文章主要介紹了從Myeclipse 導入到eclipse中無法識別為 web項目 問題的解決步驟,需要的朋友可以參考下
    2018-05-05
  • 基于java springboot + mybatis實現電影售票管理系統

    基于java springboot + mybatis實現電影售票管理系統

    這篇文章主要介紹了基于java springboot + mybatis實現的完整電影售票管理系統基于java springboot + mybatis,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • httpclient 請求http數據,json轉map的實例

    httpclient 請求http數據,json轉map的實例

    下面小編就為大家?guī)硪黄猦ttpclient 請求http數據,json轉map的實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 編程語言榜單Java與Python并列第二!Julia下滑

    編程語言榜單Java與Python并列第二!Julia下滑

    日新月異的技術圈,隨著云、大數據、人工智能等主流技術的廣泛應用,作為開發(fā)利器的編程語言的最新發(fā)展趨勢也在無形中發(fā)生了變化,本文主要介紹了java、Python、Julia等語言在Resmonk榜單的排名
    2021-08-08
  • SpringMVC數據輸出相關知識總結

    SpringMVC數據輸出相關知識總結

    今天帶大家學習SpringMVC的相關知識,文中對SpringMVC數據輸出作了非常詳細的代碼示例,對正在學習的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06

最新評論