建造者模式(Builder Pattern)主要用于“分步驟構(gòu)建一個(gè)復(fù)雜的對(duì)象”,在這其中“分步驟”是一個(gè)穩(wěn)定的算法,而復(fù)雜對(duì)象的各個(gè)部分則經(jīng)常變化。因此, 建造者模式主要用來(lái)解決“對(duì)象部分”的需求變化。 這樣可以對(duì)對(duì)象構(gòu)造的過(guò)程進(jìn)行更加精細(xì)的控制。
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; /** * 功能:意圖是將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示 * 適用性: * 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí) * 當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(shí) */ public abstract class PersonBuilder { //繪畫(huà)一個(gè)人物需要使用到的工具 protected String tool1; protected String tool2; public PersonBuilder(String t1, String t2) { this .tool1 = t1; this .tool2 = t2; } //繪畫(huà)頭 public abstract void buildHead(); //畫(huà)身體 public abstract void buildBody(); //畫(huà)左腳右腳 public abstract void buildArmLeft(); public abstract void buildArmRight(); //畫(huà)左手右手 public abstract void buildLegLeft(); public abstract void buildLegRight(); } |
我們的抽象生成器派生出相應(yīng)的子類(lèi),用來(lái)構(gòu)造相應(yīng)的實(shí)際使用類(lèi)型
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; /** * 功能:意圖是將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示 * 適用性: * 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí) * 當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(shí) */ public class PersonThinBuilder extends PersonBuilder { public PersonThinBuilder(String t1, String t2) { super (t1, t2); } @Override public void buildHead() { System.out.println( "畫(huà)出一個(gè)瘦子的頭" ); } @Override public void buildBody() { System.out.println( "畫(huà)出一個(gè)瘦子的身體" ); } @Override public void buildArmLeft() { System.out.println( "畫(huà)出瘦子的左臂" ); } @Override public void buildArmRight() { System.out.println( "畫(huà)出瘦子的右臂" ); } @Override public void buildLegLeft() { System.out.println( "畫(huà)出瘦子左腿" ); } @Override public void buildLegRight() { System.out.println( "畫(huà)出瘦子的右腿" ); } } |
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; /** * 功能:意圖是將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示 * 適用性: * 當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí) * 當(dāng)構(gòu)造過(guò)程必須允許被構(gòu)造的對(duì)象有不同的表示時(shí) */ public class PersonFatBuilder extends PersonBuilder { public PersonFatBuilder(String t1, String t2) { super (t1, t2); } @Override public void buildHead() { System.out.println( "畫(huà)出一個(gè)胖子的頭" ); } @Override public void buildBody() { System.out.println( "畫(huà)出一個(gè)胖子的身體" ); } @Override public void buildArmLeft() { System.out.println( "畫(huà)出胖子的左臂" ); } @Override public void buildArmRight() { System.out.println( "畫(huà)出胖子的右臂" ); } @Override public void buildLegLeft() { System.out.println( "畫(huà)出胖子左腿" ); } @Override public void buildLegRight() { System.out.println( "畫(huà)出胖子的右腿" ); } } |
我們的生成器交給指揮者來(lái)實(shí)現(xiàn)創(chuàng)建的動(dò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; //傳遞相應(yīng)的人物創(chuàng)建模型 public PersonDirector(PersonBuilder pber) { this .pb = pber; } //創(chuàng)建一個(gè)人 public void createPerson() { pb.buildHead(); pb.buildBody(); pb.buildArmLeft(); pb.buildArmRight(); pb.buildLegLeft(); pb.buildLegRight(); } } |
測(cè)試案例:
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; /** * 功能:客戶(hù)端程序 */ public class Test { //創(chuàng)建相應(yīng)的人物 public static void create(PersonBuilder pb) { //借助參數(shù)傳過(guò)來(lái)的模型創(chuàng)建相應(yīng)的對(duì)象 PersonDirector pd = new PersonDirector(pb); pd.createPerson(); } public static void main(String []args) { PersonThinBuilder ptb = new PersonThinBuilder( "圖像工具" , "畫(huà)筆" ); create(ptb); //創(chuàng)建一個(gè)瘦子 System.out.println( "==============================================================" ); PersonFatBuilder pfb = new PersonFatBuilder( "圖像工具" , "畫(huà)筆" ); create(pfb); } } |
運(yùn)行結(jié)果:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
畫(huà)出一個(gè)瘦子的頭 畫(huà)出一個(gè)瘦子的身體 畫(huà)出瘦子的左臂 畫(huà)出瘦子的右臂 畫(huà)出瘦子左腿 畫(huà)出瘦子的右腿 ============================================================== 畫(huà)出一個(gè)胖子的頭 畫(huà)出一個(gè)胖子的身體 畫(huà)出胖子的左臂 畫(huà)出胖子的右臂 畫(huà)出胖子左腿 畫(huà)出胖子的右腿 |
以上就是java建造者模式,希望對(duì)大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。