溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java利用構(gòu)建器來創(chuàng)建實例

發(fā)布時間:2020-07-15 01:29:02 來源:網(wǎng)絡 閱讀:132 作者:nineteens 欄目:編程語言

  java利用構(gòu)建器來創(chuàng)建實例而不是構(gòu)造器

  對于類而言,為了讓客戶端獲取他本身的一個實例,

  最傳統(tǒng)的方法就是提供一個公有的構(gòu)造器。

  一個類中

  重載多個構(gòu)造器

  客戶面對多個構(gòu)造器這種API永遠也記不住該用哪個構(gòu)造器,

  并且每次調(diào)用構(gòu)造器必然會創(chuàng)建新的對象,

  如果程序需要重復使用對象,構(gòu)造器無法避免創(chuàng)建不必要的對象。

  靜態(tài)工廠方法與構(gòu)造器不同的

  第一大優(yōu)勢為:他們有名稱

  第二大優(yōu)勢為:不必每一次調(diào)用他們的時候創(chuàng)建一個新對象

  第三大優(yōu)勢為:他們可以返回原返回類型的任何子類型的對象

  第四大優(yōu)勢為:所返回的對象的類隨著每次調(diào)用發(fā)生變化,這取決于靜態(tài)方法的參數(shù)值

  下面是靜態(tài)工廠方法的一些慣用名稱

  1)from---------------------類型轉(zhuǎn)換方法

  Date d = Date.from(instant)

  2)of------------------------聚合方法,帶有多個參數(shù),返回該類型的一個實例,把他們合并起來

  Set faceCard = EnumSet.of(JACK,QUEEN,KING)

  3)valueOf-----------------比前兩個更繁瑣的方法BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE)

  …

  一個構(gòu)造器中有多個參數(shù)時

  靜態(tài)工廠和構(gòu)造器有個共同的局限性:

  他們都不能很好的擴展到大量的可選參數(shù)。

  比如用一個類來表示食品外面的營養(yǎng)成分標簽。

  構(gòu)造器調(diào)用了通常你不想設置的參數(shù),

  僅僅是幾個參數(shù)還可接受,但隨著參數(shù)的增加,很快就失去了控制。

  簡而言之,重疊構(gòu)造器模式可行,但當有更多的參數(shù)是,客戶端的代碼會看起來非常糟糕。

  javaBean看起來強于上述的重疊構(gòu)造器模式,但同時也會帶來多線程下不安全的問題

  那么,我們的構(gòu)建器出場了。

  利用靜態(tài)內(nèi)部類Builder,定義與外部類的成員完全相同的成員變量。

  類似于javaBean的模式設置每一個參數(shù)

  最后用build方法構(gòu)建外部類的新實例(調(diào)用外部類的私有構(gòu)造器)

  Main.java

  public class Main

  {

  public static void main(String[] args)

  {

  //初始化一個NutritionFacts實例,一定要最后調(diào)用build()方法去調(diào)用NutritionFacts類的構(gòu)造器去實例化NutritionFacts的對象

  NutritionFacts cocaCola = new NutritionFacts.Builder(120,200).calories(1).carbohydrate(22).build();

  //并且參數(shù)由客戶端調(diào)用時決定,并不是一定要固定輸入?yún)?shù),改進寫重載很多構(gòu)造器給用戶帶來麻煩

  //javaBean改進了重載一大堆構(gòu)造器的問題,卻也帶來了線程不安全的問題

  NutritionFacts cocaCola1 = new NutritionFacts.Builder(223,233).build();

  }鄭州較好的婦科醫(yī)院 http://www.kd0371.com/

  }

  NutritionFacts.java

  public class NutritionFacts

  {

  private final int servingSize;

  private final int servings;

  private final int calories;

  private final int fat;

  private final int sodium;

  private final int carbohydrate;

  //私有構(gòu)造器方法

  private NutritionFacts(Builder build)

  {

  this.servingSize=build.servingSize;

  this.servings=build.servings;

  this.calories=build.calories;

  this.fat=build.fat;

  this.sodium=build.sodium;

  this.carbohydrate=build.carbohydrate;

  }

  //構(gòu)建者模式(Builder為靜態(tài)內(nèi)部類)可由外部直接訪問

  public static class Builder

  {

  private final int servingSize;

  private final int servings;

  //初始化默認值

  private int calories=0;

  private int fat=0;

  private int sodium=0;

  private int carbohydrate=0;

  //構(gòu)造器用于初始化不可變(final)參數(shù)

  public Builder(int servingSize,int servings)

  {

  this.servingSize=servingSize;

  this.servings=servings;

  }

  //以下的方法均用于初始化每一個成員

  public Builder calories(int calories)

  {

  this.calories=calories;

  return this;

  }

  public Builder fat(int fat)

  {

  this.fat=fat;

  return this;

  }

  public Builder sodium(int sodium)

  {

  this.sodium=sodium;

  return this;

  }

  public Builder carbohydrate(int carbohydrate)

  {

  this.carbohydrate=carbohydrate;

  return this;

  }

  //最后構(gòu)造NutritionFacts類的實例,該方法定義于Builder類中

  public NutritionFacts build()

  {

  return new NutritionFacts(this);

  }

  }

  }


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI