引入#####
有時(shí),我們會(huì)遇到需要設(shè)置多個(gè)參數(shù)的構(gòu)造器,此時(shí)無論是使用靜態(tài)工廠還是構(gòu)造器都有局限性,那就是可讀性低。如:
<code>
NutritionFacts cocaCola=new NutrutionFacts(240,8,100,0,35,27);
</code>
此時(shí)用戶難以閱讀,必須仔細(xì)的查看API文檔,這些參數(shù)都對(duì)應(yīng)著什么,如果不小心搞錯(cuò)了兩個(gè)參數(shù)的位置,編譯器不會(huì)報(bào)錯(cuò),但程序運(yùn)行時(shí)會(huì)出錯(cuò),而且難以檢查。
使用JavaBean模式#####
調(diào)用一個(gè)無參的構(gòu)造器來創(chuàng)建對(duì)象,然后調(diào)用setter方法來設(shè)置每個(gè)必要的參數(shù)或可選的參數(shù)。
NutritionFacts cocaCola=new NutritionFacts();
cocaCola.setServingSize(240);
cocaCola.setServings(8);
cocaCola.setCalories(100)
cocaCola.setSodium(35);
但是JavaBeans模式自身有很嚴(yán)重的缺點(diǎn),因?yàn)闃?gòu)造過程被分到了幾個(gè)調(diào)用中,在構(gòu)造過程中JavaBean可能處于不一致的狀態(tài)。需要程序員付出額外的努力來確保它的線程安全。
Builder模式#####
不直接生成想要的對(duì)象,讓用戶先調(diào)用參數(shù)構(gòu)造器,得到一個(gè)builder對(duì)象,然后調(diào)用無參的build()函數(shù)來生成對(duì)象。
NutritionFacts cocaCola=new NutritionFacts.Builder(240,8)
.calories(100).sodium(35).carbohydrate(27).build();
Builder模式編碼容易,易于閱讀。