Separate the construction of a complex object from its representation so that the same construction process can create different representations. java
將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。設計模式
產品的抽象類:
ui
package Builder; import java.util.ArrayList; public abstract class AbstractProduct { //記錄執行順序 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; } }
產品的實現類:this
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..."); } }
建造者抽象類:
spa
package Builder; import java.util.ArrayList; public abstract class Builder { //設置產品的不一樣部分,以得到不一樣的產品 public abstract void setPart(ArrayList<String> part); //建造產品 public abstract Product buildProduct(); }
建造者實現類:
設計
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; } }
導演類:
code
package Builder; import java.util.ArrayList; //對不一樣產品的生產順序再封裝,對高層屏蔽細節 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("將產生10個產品"); for(int i=1;i<11;i++){ System.out.println("第" + i + "個產品"); director.getAProduct().executive(); System.out.println(); } } }
說明:get
Product 產品類:一般是實現了模板方法模式,也就是有模板方法和基本方法;產品
Builder 抽象建造者:規範產品的組建,通常是由子類實現。
ConcreteBuilder 具體建造者實現抽象類定義的全部方法,而且返回一個組件好的對象。
Director 導演:負責安排已有模塊的順序,而後告訴Builder開始建造;
1. 良好的封裝性
2. 建造者獨立,內容可擴展
3. 便於控制細節風險
1.相同的方法,不一樣的執行順序,產生不一樣的結果
2.多個部件均可以裝配到一個對象中,產生的結果又不相同
3.產品類很是複雜
參考資料:
《設計模式之禪》 秦小波著 第十一章建造者模式
百度百科 建造者模式