jQuery選擇器
717
2025-04-03
在現實生活中如果我們需要制造一個比較復雜的東西,比如手機,臺式電腦,或者汽車等。如果我們要制造一臺電腦的話我們會先將電腦所需的各個部件買回來然后在組裝起來成為一臺電腦。這里電腦所需的各個組件比如顯示器,CPU,硬盤等等都是由不同的廠商生產的,然后被我們不同的組合而成了不同的產品。這是現實生活中和建造者模式類似的場景,而在程序中也一樣有些情況下我們需要
創建比較復雜的對象
,在這種場景下我們可以通過建造者模式來實現,
建造者模式
實際開發中,我們所需要的對象構建時非常復雜,且有很多步驟需要處理時,這時建造者模式就很適合。
建造模式的本質:
分離了對象子組件的
單獨構造
(由Builder來負責)和
裝配
(由Director負責)。 從而可以構造出復雜的對象。這個模式適用于:某個對象的構建過程復雜的情況下使用。
由于實現了構建和裝配的解耦。不同的構建器,相同的裝配,也可以做出不同的對象;相同的構建器,不同的裝配順序也可以做出不同的對象。也就是實現了構建算法、裝配算法的解耦,實現了更好的復用
程序實現
類圖
太空飛船
創建我們的太空飛船類,也就是我們最終的產品類
package com.dpb.build; /** * 太空飛船 * @author 波波烤鴨 * */ public class AirShip { // 軌道艙 private OrbitalModule orbitalModule; // 發動機 private Engine engine; // 逃生塔 private EscapeTower escapeTower; public void launch(){ System.out.println("發射..."); } public OrbitalModule getOrbitalModule() { return orbitalModule; } public void setOrbitalModule(OrbitalModule orbitalModule) { this.orbitalModule = orbitalModule; } public Engine getEngine() { return engine; } public void setEngine(Engine engine) { this.engine = engine; } public EscapeTower getEscapeTower() { return escapeTower; } public void setEscapeTower(EscapeTower escapeTower) { this.escapeTower = escapeTower; } } // 軌道艙 class OrbitalModule{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public OrbitalModule(String name) { super(); this.name = name; } } // 發動機 class Engine{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Engine(String name) { super(); this.name = name; } } // 逃生塔 class EscapeTower{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public EscapeTower(String name) { super(); this.name = name; } }
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
組件構造者
定義我們的組件構造者及實現組件構造者
/** * 定義飛船建造的規則 * @author dengp * */ public interface AirShipBuild { OrbitalModule buildOrbitalModule(); Engine buildEngine(); EscapeTower buildeEscapeTower(); }
1
2
3
4
5
6
7
8
9
10
11
package com.dpb.build; /** * 構建飛船相關的組件 * @author dengp * */ public class DpbAirShipBuild implements AirShipBuild{ @Override public OrbitalModule buildOrbitalModule() { System.out.println("烤鴨牌軌道艙"); return new OrbitalModule("烤鴨牌軌道艙"); } @Override public Engine buildEngine() { System.out.println("烤鴨牌發動機"); return new Engine("波波烤鴨牌發動機"); } @Override public EscapeTower buildeEscapeTower() { System.out.println("烤鴨牌逃生艙"); return new EscapeTower("烤鴨牌逃生塔"); } }
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
產品組裝
定義產品組裝接口及組裝的實現
package com.dpb.build; public interface AirShipDirector { // 組裝飛船 AirShip directorAirShip(); }
1
2
3
4
5
6
7
8
package com.dpb.build; /** * 組裝波波牌飛船 * @author dengp * */ public class DpbAirShipDirector implements AirShipDirector{ private AirShipBuild build; public DpbAirShipDirector(AirShipBuild build) { super(); this.build = build; } @Override public AirShip directorAirShip() { // 通過構建工具分別構建各組件 Engine engine = build.buildEngine(); OrbitalModule orbitalModule = build.buildOrbitalModule(); EscapeTower escapeTower = build.buildeEscapeTower(); // 組裝相關組件 AirShip ship = new AirShip(); ship.setEngine(engine); ship.setEscapeTower(escapeTower); ship.setOrbitalModule(orbitalModule); return ship; } }
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
測試
public class Client { public static void main(String[] args) { // 1.創建者 AirShipBuild build = new DpbAirShipBuild(); // 2.創建構建器 AirShipDirector director = new DpbAirShipDirector(build); AirShip ship = director.directorAirShip(); ship.launch(); } }
1
2
3
4
5
6
7
8
9
10
11
輸出結果
烤鴨牌發動機 烤鴨牌軌道艙 烤鴨牌逃生艙 發射...
1
2
3
4
開發中應用場景:
StringBuilder類的append方法
SQL中的PreparedStatement
JDOM中,DomBuilder、SAXBuilder
Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。