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