建造者模式(一)
建造者模式
一、建造者模式的定義
將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示,建造者模式是一步步建立一個複雜的物件,它允許使用者只通過指定複雜物件型別和內容就可以構建他們,使用者不需要知道內部的具體構造細節。
二、模式的理解
對於一些複雜的物件,它們擁有多個組成部分,如電腦,它包括了主機板、顯示卡、記憶體等各種部件,對於大部分使用者來說,使用者知道這些部件的裝配細節,也不會獨立的使用某個部件,而是使用整個電腦。此時,就可以通過建造者模式對其進行設計與描述,建造者模式可以將部件和其組建過程分開,一步一步的建立一個複雜的物件。使用者只需要指定複雜物件的型別就可以得到該物件,而無須知道內部的具體構造細節。
三、模式的結構
建造者模式包含如下角色
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()); } }
列印結果:
---------------------------------------歡迎關注------------------------------------------