定義:將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
類型:創(chuàng)建類模式
類圖:
四個要素
代碼實現(xiàn)
產(chǎn)品的抽象類:
package Builder; import java.util.ArrayList; public abstract class AbstractProduct { //記錄執(zhí)行順序 private ArrayList<String> part = new ArrayList<String>(); public abstract void doSomething(); public abstract void doOtherthing(); //final,子類不可重寫 final public void executive(){ for(int i=0;i<this.part.size();i++){ String actionName = this.part.get(i); if(actionName.equals("doSomething")){ this.doSomething(); } else if(actionName.equals("doOtherthing")){ this.doOtherthing(); } } } //final,子類不可重寫 final public void setPart(ArrayList<String> part){ this.part = part; }}
產(chǎn)品的實現(xiàn)類:
package Builder; public class Product extends AbstractProduct{ //子類具體描述步驟 public void doSomething(){ System.out.println("will do something..."); } public void doOtherthing() { System.out.println("Something has done.Otherthing will be done..."); }}
建造者抽象類:
package Builder; import java.util.ArrayList; public abstract class Builder { //設(shè)置產(chǎn)品的不同部分,以獲得不同的產(chǎn)品 public abstract void setPart(ArrayList<String> part); //建造產(chǎn)品 public abstract Product buildProduct(); }
建造者實現(xiàn)類:
package Builder; import java.util.ArrayList; public class ConcreteProduct extends Builder{ private Product product = new Product(); public void setPart(ArrayList<String> part) { this.product.setPart(part); } public Product buildProduct() { return this.product; } }
導(dǎo)演類:
package Builder; import java.util.ArrayList; //對不同產(chǎn)品的生產(chǎn)順序再封裝,對高層屏蔽細節(jié)public class Director { private ArrayList<String> part = new ArrayList<String>(); private Builder builder = new ConcreteProduct(); public Product getAProduct() { this.part.clear(); this.part.add("doSomething"); this.part.add("doOtherthing"); builder.setPart(part); return builder.buildProduct(); }}
客戶端:
package Builder; public class Client { public static void main(String[] args) { Director director = new Director(); System.out.println("將產(chǎn)生10個產(chǎn)品"); for(int i=1;i<11;i++){ System.out.println("第" + i + "個產(chǎn)品"); director.getAProduct().executive(); System.out.println(); } }}
建造者模式的優(yōu)點
首先,建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般產(chǎn)品類和建造者類是比較穩(wěn)定的,因此,將主要的業(yè)務(wù)邏輯封裝在導(dǎo)演類中對整體而言可以取得比較好的穩(wěn)定性。
其次,建造者模式很容易進行擴展。如果有新的需求,通過實現(xiàn)一個新的建造者類就可以完成,基本上不用修改之前已經(jīng)測試通過的代碼,因此也就不會對原有功能引入風(fēng)險。
建造者模式與工廠模式的區(qū)別
我們可以看到,建造者模式與工廠模式是極為相似的,總體上,建造者模式僅僅只比工廠模式多了一個“導(dǎo)演類”的角色。在建造者模式的類圖中,假如把這個導(dǎo)演類看做是最終調(diào)用的客戶端,那么圖中剩余的部分就可以看作是一個簡單的工廠模式了。
與工廠模式相比,建造者模式一般用來創(chuàng)建更為復(fù)雜的對象,因為對象的創(chuàng)建過程更為復(fù)雜,因此將對象的創(chuàng)建過程獨立出來組成一個新的類――導(dǎo)演類。也就是說,工廠模式是將對象的全部創(chuàng)建過程封裝在工廠類中,由工廠類向客戶端提供最終的產(chǎn)品;而建造者模式中,建造者類一般只提供產(chǎn)品類中各個組件的建造,而將具體建造過程交付給導(dǎo)演類。由導(dǎo)演類負責(zé)將各個組件按照特定的規(guī)則組建為產(chǎn)品,然后將組建好的產(chǎn)品交付給客戶端。
總結(jié)
建造者模式與工廠模式類似,他們都是建造者模式,適用的場景也很相似。一般來說,如果產(chǎn)品的建造很復(fù)雜,那么請用工廠模式;如果產(chǎn)品的建造更復(fù)雜,那么請用建造者模式。
新聞熱點
疑難解答