概括
|
名稱 |
Builder |
|
結構 |
|
|
動機 |
將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 |
|
適用性 |
|
解析
形象比喻:
BUILDER—MM最愛聽的就是“我愛你”這句話了,見到不同地方的MM,要能夠用她們的方言跟她說這句話哦,我有一個多種語言翻譯機,上面每種語言都有一個按鍵,見到MM我只要按對應的鍵,它就能夠用相應的語言說出“我愛你”這句話了,國外的MM也可以輕鬆搞定,這就是我的“我愛你”builder。(這一定比美軍在伊拉克用的翻譯機好賣)
建造模式:將對象的內部表象和對象的產生過程分割開來,從而使一個建造過程產生具有不同的內部表象的產品對象。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。
1.Builder
為建立一個Product對象的各個組件指定抽象介面。
2.ConcreteBuilder
實現Builder的介面以構造和裝配該產品的各個組件。
定義並明確它所建立的表示。
提供一個檢索產品的介面。
3.Director
構造一個使用Builder介面的對象。
4.Product
表示被構造的複雜物件。ConcreteBuilder建立該產品的內部表示並定義它的裝配過程。
包含定義組成組件的類,包括將這些組件裝配成最終產品的介面。
執行個體
涉及的檔案有
IProductBuilder.java
- SoftwareBuilder.java
Product.java
ProductDirector.java
TestMain.java
Product 是一個產品類,是一個簡單的java bean, 包含一些屬性及對應的set ,get 方法。
IProductBuilder和SoftwareBuilder, 構造器的介面和實作類別, 定義有一些方法執行個體化特定的 Product。
ProductDirector 使用Builder並調用相關方法返回構造的Product.
/** * @author oscar999 * @date 2013-7-18 * @version V1.0 */package designptn.builder;public class Product {private String head;private String body;private String foot;/** * @return the head */public String getHead() {return head;}/** * @param head * the head to set */public void setHead(String head) {this.head = head;}/** * @return the body */public String getBody() {return body;}/** * @param body * the body to set */public void setBody(String body) {this.body = body;}/** * @return the foot */public String getFoot() {return foot;}/** * @param foot * the foot to set */public void setFoot(String foot) {this.foot = foot;}}
/** * @author oscar999 * @date 2013-7-18 * @version V1.0 */package designptn.builder;public interface IProductBuilder {void buildHead();void buildBody();void buildFoot();Product buildProduct();}
/** * @author oscar999 * @date 2013-7-18* @version V1.0 */package designptn.builder;public class SoftwareBuilder implements IProductBuilder { Product product; public SoftwareBuilder(){ product = new Product(); }@Overridepublic void buildHead() {// TODO Auto-generated method stubproduct.setHead("Software Head");}@Overridepublic void buildBody() {// TODO Auto-generated method stubproduct.setBody("Software Body");}@Overridepublic void buildFoot() {// TODO Auto-generated method stubproduct.setFoot("Software Foot");}@Overridepublic Product buildProduct() {// TODO Auto-generated method stubreturn product;}}
/** * @author oscar999 * @date 2013-7-18 * @version V1.0 */package designptn.builder;public class ProductDirector {public Product constructProduct(SoftwareBuilder pb) {pb.buildHead();pb.buildBody();pb.buildFoot();return pb.buildProduct();}}
/** * @author oscar999 * @date 2013-7-18* @version V1.0 */package designptn.builder;public class TestMain {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubProductDirector pd = new ProductDirector();Product product = pd.constructProduct(new SoftwareBuilder());System.out.println(product.getHead());System.out.println(product.getBody());System.out.println(product.getFoot());}}
一言蔽之,就是不直接執行個體化需要的類,而是通過構造器構建。