1. 程式人生 > >建造者模式(一)

建造者模式(一)

建造者模式

一、建造者模式的定義

將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示,建造者模式是一步步建立一個複雜的物件,它允許使用者只通過指定複雜物件型別和內容就可以構建他們,使用者不需要知道內部的具體構造細節。

二、模式的理解

對於一些複雜的物件,它們擁有多個組成部分,如電腦,它包括了主機板、顯示卡、記憶體等各種部件,對於大部分使用者來說,使用者知道這些部件的裝配細節,也不會獨立的使用某個部件,而是使用整個電腦。此時,就可以通過建造者模式對其進行設計與描述,建造者模式可以將部件和其組建過程分開,一步一步的建立一個複雜的物件。使用者只需要指定複雜物件的型別就可以得到該物件,而無須知道內部的具體構造細節。

三、模式的結構

建造者模式包含如下角色

1.Builder(抽象建造者)

抽象建造者為建立一個產品(YuanShi)物件的各個部分指定抽象介面,在該介面中一般宣告兩類方法,一類是builderX(),他們用於建立複雜物件的各個部分;另一類方法是getX(),它們用於返回複雜物件。它既可以是抽象類,也可以是介面。

2.ConcreteBuilder(具體建造者)

具體建造者實現了Builder介面,實現各個部分的構造和裝配方法,定義並明確它所建立的複雜物件,也可以提供一個方法返回建立好的複雜產品物件。

3.Product(產品角色)

產品角色是被構建的複雜物件,包含多個組成部分,具體建造者建立該產品的內部表示並定義它的標配過程。

4.Director(指揮者)

指揮者負責安排複雜物件的建造次序,指揮者與抽象建造者之間存在關聯關係,可以在其construct()建造方法中呼叫建造者物件的部件構造與裝配方法,完成複雜物件的建造。

四、例項程式碼分析

(1)、產品類

package com.yuanshi.eryu;

/**  * 生成猿獅這個產品類  */  public class YuanShi {     // 產品類中的部件     private String java;     private String python;               public String getJava() {         return java;     }          public void setJava(String java) {         this.java = java;     }          public String getPython() {         return python;     }          public void setPython(String python) {         this.python = python;     }     

}  

(2)、抽象建造者類

package com.yuanshi.eryu;

/**  * YSBuilder是猿獅的構建者  */ public abstract class YSBuilder {     // 建立產品類(YuanShi)的物件     protected YuanShi mYuanShi = new YuanShi();     // 聲明瞭抽象的部件組裝方法builderX();     public abstract void builderJava();     public abstract void builderPython();     // 提供了工廠方法getYuanshi(),用於返回mYuanShi物件     public YuanShi getYuanShi() {         return mYuanShi;     }

}

(3)、具體建造者類

程式猿的構建者類(YuanBuilder)

package com.yuanshi.eryu; /**  * 程式猿的構建者類  */ public  class YuanBuilder extends YSBuilder{

    @Override     public void builderJava() {         // 宣告程式猿用java程式設計的具體方面         mYuanShi.setJava("用Java做後臺開發");     }

    @Override     public void builderPython() {         // 宣告程式猿用Python程式設計的具體方面         mYuanShi.setPython("用Python做爬蟲開發");     }

}

攻城獅的構建者類(ShiBuilder)

package com.yuanshi.eryu;

/**  * 攻城獅的構建者類  */ public  class ShiBuilder extends YSBuilder{

    @Override     public void builderJava() {         // 宣告攻城獅用java程式設計的具體方面         mYuanShi.setJava("用Java做安卓開發");     }

    @Override     public void builderPython() {         // 宣告攻城獅用Python程式設計的具體方面         mYuanShi.setPython("用Python做大資料開發");     }

}

(4)、指揮者類(YuanShiWaiter)

package com.yuanshi.eryu;

/**  * 猿獅的服務者類  */ public class YuanShiWaiter {

    // 定義一個抽象建造者的變數     private YSBuilder mYSBuilder;     // 設定抽象建造者的set()     public void setmYSBuilder(YSBuilder mYsBuilder) {         this.mYSBuilder = mYsBuilder;     }          // construct()對客戶端返回具體資訊     public YuanShi construct() {         mYSBuilder.builderJava();         mYSBuilder.builderPython();         return mYSBuilder.getYuanShi();     }      }

(5)、客戶端程式碼

程式猿客戶端

package com.yuanshi.eryu; /**  * 程式猿客戶端  */ public class YuanClient {          public static void main(String[] args) {         // 建立程式猿的建造者物件         YSBuilder mYuanBuilder = new YuanBuilder();         // 建立指揮者物件         YuanShiWaiter mYuanShiWaiter = new YuanShiWaiter();         // 指揮者提交資訊         mYuanShiWaiter.setmYSBuilder(mYuanBuilder);         // 獲取程式猿的資訊         YuanShi construct = mYuanShiWaiter.construct();                  System.out.println("--程式猿--");         System.out.println(construct.getJava());         System.out.println(construct.getPython());              } }

​攻城獅客戶端

package com.yuanshi.eryu; /**  * 攻城獅客戶端  */ public class ShiClient {          public static void main(String[] args) {         // 建立攻城獅的建造者物件         YSBuilder mYuanBuilder = new ShiBuilder();         // 建立指揮者物件         YuanShiWaiter mYuanShiWaiter = new YuanShiWaiter();         // 指揮者提交資訊         mYuanShiWaiter.setmYSBuilder(mYuanBuilder);         // 獲取攻城獅的資訊         YuanShi construct = mYuanShiWaiter.construct();                  System.out.println("--攻城獅--");         System.out.println(construct.getJava());         System.out.println(construct.getPython());              } }

列印結果:

   ---------------------------------------歡迎關注------------------------------------------