从身份证号码里提取生日和周岁的方法
569
2022-05-29
在现实生活中如果我们需要制造一个比较复杂的东西,比如手机,台式电脑,或者汽车等。如果我们要制造一台电脑的话我们会先将电脑所需的各个部件买回来然后在组装起来成为一台电脑。这里电脑所需的各个组件比如显示器,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小时内删除侵权内容。