模式結構: 1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:意圖是將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 6 * 適用性: 7 * 當創建複雜對象的演算法應該獨立於該對象的組成部分以及它們的裝配方式時
模式結構:
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:意圖是將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 6 * 適用性: 7 * 當創建複雜對象的演算法應該獨立於該對象的組成部分以及它們的裝配方式時 8 * 當構造過程必須允許被構造的對象有不同的表示時 9 * 時間:2016年2月12日下午4:33:59 10 * 作者:cutter_point 11 */ 12 public abstract class PersonBuilder 13 { 14 //繪畫一個人物需要使用到的工具 15 protected String tool1; 16 protected String tool2; 17 18 public PersonBuilder(String t1, String t2) 19 { 20 this.tool1 = t1; 21 this.tool2 = t2; 22 } 23 24 //繪畫頭 25 public abstract void buildHead(); 26 //畫身體 27 public abstract void buildBody(); 28 //畫左腳右腳 29 public abstract void buildArmLeft(); 30 public abstract void buildArmRight(); 31 //畫左手右手 32 public abstract void buildLegLeft(); 33 public abstract void buildLegRight(); 34 }
我們的抽象生成器派生出相應的子類,用來構造相應的實際使用類型
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:意圖是將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 6 * 適用性: 7 * 當創建複雜對象的演算法應該獨立於該對象的組成部分以及它們的裝配方式時 8 * 當構造過程必須允許被構造的對象有不同的表示時 9 * 時間:2016年2月12日下午4:50:31 10 * 作者:cutter_point 11 */ 12 public class PersonThinBuilder extends PersonBuilder 13 { 14 15 public PersonThinBuilder(String t1, String t2) 16 { 17 super(t1, t2); 18 } 19 20 @Override 21 public void buildHead() 22 { 23 System.out.println("畫出一個瘦子的頭"); 24 } 25 26 @Override 27 public void buildBody() 28 { 29 System.out.println("畫出一個瘦子的身體"); 30 } 31 32 @Override 33 public void buildArmLeft() 34 { 35 System.out.println("畫出瘦子的左臂"); 36 } 37 38 @Override 39 public void buildArmRight() 40 { 41 System.out.println("畫出瘦子的右臂"); 42 } 43 44 @Override 45 public void buildLegLeft() 46 { 47 System.out.println("畫出瘦子左腿"); 48 } 49 50 @Override 51 public void buildLegRight() 52 { 53 System.out.println("畫出瘦子的右腿"); 54 } 55 56 }
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:意圖是將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示 6 * 適用性: 7 * 當創建複雜對象的演算法應該獨立於該對象的組成部分以及它們的裝配方式時 8 * 當構造過程必須允許被構造的對象有不同的表示時 9 * 時間:2016年2月12日下午4:53:49 10 * 作者:cutter_point 11 */ 12 public class PersonFatBuilder extends PersonBuilder 13 { 14 15 public PersonFatBuilder(String t1, String t2) 16 { 17 super(t1, t2); 18 } 19 20 @Override 21 public void buildHead() 22 { 23 System.out.println("畫出一個胖子的頭"); 24 } 25 26 @Override 27 public void buildBody() 28 { 29 System.out.println("畫出一個胖子的身體"); 30 } 31 32 @Override 33 public void buildArmLeft() 34 { 35 System.out.println("畫出胖子的左臂"); 36 } 37 38 @Override 39 public void buildArmRight() 40 { 41 System.out.println("畫出胖子的右臂"); 42 } 43 44 @Override 45 public void buildLegLeft() 46 { 47 System.out.println("畫出胖子左腿"); 48 } 49 50 @Override 51 public void buildLegRight() 52 { 53 System.out.println("畫出胖子的右腿"); 54 } 55 56 }
我們的生成器交給指揮者來實現創建的動作
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:創建人物的指揮者 6 * 時間:2016年2月12日下午4:55:14 7 * 作者:cutter_point 8 */ 9 public class PersonDirector 10 { 11 private PersonBuilder pb; 12 13 //傳遞相應的人物創建模型 14 public PersonDirector(PersonBuilder pber) 15 { 16 this.pb = pber; 17 } 18 19 //創建一個人 20 public void createPerson() 21 { 22 pb.buildHead(); 23 pb.buildBody(); 24 pb.buildArmLeft(); 25 pb.buildArmRight(); 26 pb.buildLegLeft(); 27 pb.buildLegRight(); 28 } 29 }
測試案例:
1 package com.shejimoshi.create.Builder; 2 3 4 /** 5 * 功能:客戶端程式 6 * 時間:2016年2月12日下午4:57:41 7 * 作者:cutter_point 8 */ 9 public class Test 10 { 11 //創建相應的人物 12 public static void create(PersonBuilder pb) 13 { 14 //藉助參數傳過來的模型創建相應的對象 15 PersonDirector pd = new PersonDirector(pb); 16 pd.createPerson(); 17 } 18 19 public static void main(String []args) 20 { 21 PersonThinBuilder ptb = new PersonThinBuilder("圖像工具", "畫筆"); 22 create(ptb); //創建一個瘦子 23 System.out.println("=============================================================="); 24 PersonFatBuilder pfb = new PersonFatBuilder("圖像工具", "畫筆"); 25 create(pfb); 26 } 27 }
運行結果:
1 畫出一個瘦子的頭 2 畫出一個瘦子的身體 3 畫出瘦子的左臂 4 畫出瘦子的右臂 5 畫出瘦子左腿 6 畫出瘦子的右腿 7 ============================================================== 8 畫出一個胖子的頭 9 畫出一個胖子的身體 10 畫出胖子的左臂 11 畫出胖子的右臂 12 畫出胖子左腿 13 畫出胖子的右腿