建造者模式(Builder Pattern)主要用于“分步驟構建一個復雜的對象”,在這其中“分步驟”是一個穩(wěn)定的算法,而復雜對象的各個部分則經常變化。因此, 建造者模式主要用來解決“對象部分”的需求變化。 這樣可以對對象構造的過程進行更加精細的控制。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package com.shejimoshi.create.Builder; /** * 功能:意圖是將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示 * 適用性: * 當創(chuàng)建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時 * 當構造過程必須允許被構造的對象有不同的表示時 */ public abstract class PersonBuilder { //繪畫一個人物需要使用到的工具 protected String tool1; protected String tool2; public PersonBuilder(String t1, String t2) { this .tool1 = t1; this .tool2 = t2; } //繪畫頭 public abstract void buildHead(); //畫身體 public abstract void buildBody(); //畫左腳右腳 public abstract void buildArmLeft(); public abstract void buildArmRight(); //畫左手右手 public abstract void buildLegLeft(); public abstract void buildLegRight(); } |
我們的抽象生成器派生出相應的子類,用來構造相應的實際使用類型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package com.shejimoshi.create.Builder; /** * 功能:意圖是將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示 * 適用性: * 當創(chuàng)建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時 * 當構造過程必須允許被構造的對象有不同的表示時 */ public class PersonThinBuilder extends PersonBuilder { public PersonThinBuilder(String t1, String t2) { super (t1, t2); } @Override public void buildHead() { System.out.println( "畫出一個瘦子的頭" ); } @Override public void buildBody() { System.out.println( "畫出一個瘦子的身體" ); } @Override public void buildArmLeft() { System.out.println( "畫出瘦子的左臂" ); } @Override public void buildArmRight() { System.out.println( "畫出瘦子的右臂" ); } @Override public void buildLegLeft() { System.out.println( "畫出瘦子左腿" ); } @Override public void buildLegRight() { System.out.println( "畫出瘦子的右腿" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
package com.shejimoshi.create.Builder; /** * 功能:意圖是將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示 * 適用性: * 當創(chuàng)建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時 * 當構造過程必須允許被構造的對象有不同的表示時 */ public class PersonFatBuilder extends PersonBuilder { public PersonFatBuilder(String t1, String t2) { super (t1, t2); } @Override public void buildHead() { System.out.println( "畫出一個胖子的頭" ); } @Override public void buildBody() { System.out.println( "畫出一個胖子的身體" ); } @Override public void buildArmLeft() { System.out.println( "畫出胖子的左臂" ); } @Override public void buildArmRight() { System.out.println( "畫出胖子的右臂" ); } @Override public void buildLegLeft() { System.out.println( "畫出胖子左腿" ); } @Override public void buildLegRight() { System.out.println( "畫出胖子的右腿" ); } } |
我們的生成器交給指揮者來實現(xiàn)創(chuàng)建的動作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package com.shejimoshi.create.Builder; /** * 功能:創(chuàng)建人物的指揮者 */ public class PersonDirector { private PersonBuilder pb; //傳遞相應的人物創(chuàng)建模型 public PersonDirector(PersonBuilder pber) { this .pb = pber; } //創(chuàng)建一個人 public void createPerson() { pb.buildHead(); pb.buildBody(); pb.buildArmLeft(); pb.buildArmRight(); pb.buildLegLeft(); pb.buildLegRight(); } } |
測試案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package com.shejimoshi.create.Builder; /** * 功能:客戶端程序 */ public class Test { //創(chuàng)建相應的人物 public static void create(PersonBuilder pb) { //借助參數(shù)傳過來的模型創(chuàng)建相應的對象 PersonDirector pd = new PersonDirector(pb); pd.createPerson(); } public static void main(String []args) { PersonThinBuilder ptb = new PersonThinBuilder( "圖像工具" , "畫筆" ); create(ptb); //創(chuàng)建一個瘦子 System.out.println( "==============================================================" ); PersonFatBuilder pfb = new PersonFatBuilder( "圖像工具" , "畫筆" ); create(pfb); } } |
運行結果:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
畫出一個瘦子的頭 畫出一個瘦子的身體 畫出瘦子的左臂 畫出瘦子的右臂 畫出瘦子左腿 畫出瘦子的右腿 ============================================================== 畫出一個胖子的頭 畫出一個胖子的身體 畫出胖子的左臂 畫出胖子的右臂 畫出胖子左腿 畫出胖子的右腿 |
以上就是java建造者模式,希望對大家學習java程序設計有所幫助。