23种设计模式----建造者模式----创建型模式
本文深入解析建造者模式,探讨其如何解决复杂问题的构建,通过不断扩充的方式完成复杂需求。文章详细介绍了建造者模式的角色分工,包括建造接口、工头和不同级别的建造者,以及其实现过程和实例代码。通过测试结果,展示了建造者模式的灵活性和可扩展性。
文章信息
- 原文链接:https://jiayq.blog.csdn.net/article/details/83538512
- 发布时间:2018-10-30 10:59:56
- 阅读量:413
- 分类:java同时被 2 个专栏收录, 订阅专栏, 设计模式
- 标签:#设计模式, #建造者模式, #创建型模式, #扩充, #Bulid
摘要
文章浏览阅读413次。本文深入解析建造者模式,探讨其如何解决复杂问题的构建,通过不断扩充的方式完成复杂需求。文章详细介绍了建造者模式的角色分工,包括建造接口、工头和不同级别的建造者,以及其实现过程和实例代码。通过测试结果,展示了建造者模式的灵活性和可扩展性。
建造者模式
- 1.建造者模式解决的问题
- 2.建造者模式中的角色
- 3.建造者模式的调用过程
- 4建造者实例
- 4.1角色说明
- 4.2建造接口:
- 4.3工头
- 4.4建造者1
- 4.5建造者2
- 4.6建造者3
- 4.7工具类
- 4.8测试方法
- 4.1角色说明
- 5测试结果
- 6.总结
1.建造者模式解决的问题
当我们处理比较复杂的问题时,很难一次性的解决,或者当问题比较复杂,一次性难以完成时。
建造者模式提供一个在原基础上不断扩充的模式,我们可以在上次的基础上增加一些的新的内容。
最终,完成较为复杂的需要。
建造者模式不断扩充。
另一种理解:
看书上的意思应该是同一个流程实现不同的产品,其实我个人觉得,这里和模板方法以及工厂模式等等非常的类似。
**
注意:本文所写可能与大多数其他的建造者解释有所不同,请注意。
**
2.建造者模式中的角色
1.建造:接口类型,主要定义了建造者最核心的,必须实现的方法。
2.工头:建造接口的使用者,主要作用就是协调建造接口中核心方法的调用
3.建造者:建造接口的扩充类或者上一个建造者的继承类。
3.建造者模式的调用过程
1.在测试类中调用工头的建造方法
2.在工头的建造方法中会要求传入一个建造者
3.按照工头方法中的顺序调用建造者的建造方法
4建造者实例
4.1角色说明
建造接口:
Bulid
建造者:
Bulider#
(#代表建造者的标识,比如Bulider1,Bulider2…)
工头:
Headman
工具:
OutUtil
4.2建造接口:
1
2
3
4
5
6
7
8
9
public interface Build {
void startBulid(String string);
void buliding(String string);
void endBulid(String string);
}
4.3工头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Headman {
private static final Headman headman = new Headman();
private Headman(){
}
public static Headman getHeadman(){
return headman;
}
public void doBulid(Build build){
build.startBulid("start");
build.buliding("doing");
build.endBulid("ended");
}
}
4.4建造者1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Bulider1 implements Build{
@Override
public void startBulid(String string) {
OutUtil.say(string);
OutUtil.say("Bulider1");
}
@Override
public void buliding(String string) {
OutUtil.say(string);
OutUtil.say("Bulider1");
}
@Override
public void endBulid(String string) {
OutUtil.say(string);
OutUtil.say("Bulider1");
}
}
4.5建造者2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Bulider2 extends Bulider1{
@Override
public void startBulid(String string){
super.startBulid(string);
OutUtil.say(string);
OutUtil.say("Bulider2");
}
@Override
public void buliding(String string){
super.buliding(string);
OutUtil.say(string);
OutUtil.say("Bulider2");
}
@Override
public void endBulid(String string){
super.endBulid(string);
OutUtil.say(string);
OutUtil.say("Bulider2");
}
}
4.6建造者3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Bulider3 extends Bulider2{
@Override
public void startBulid(String string){
super.startBulid(string);
OutUtil.say(string);
OutUtil.say("Bulider3");
}
@Override
public void buliding(String string){
super.buliding(string);
OutUtil.say(string);
OutUtil.say("Bulider3");
}
@Override
public void endBulid(String string){
super.endBulid(string);
OutUtil.say(string);
OutUtil.say("Bulider3");
}
}
4.7工具类
1
2
3
4
5
6
7
public class OutUtil {
public static void say(String string){
System.out.println("---------------------"+string+"--------------------------");
}
}
4.8测试方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Main {
public static void main(String[] args) {
OutUtil.say("这是bulider1");
Headman.getHeadman().doBulid(new Bulider1());
System.out.println();
System.out.println();
OutUtil.say("这是bulider2");
Headman.getHeadman().doBulid(new Bulider2());
System.out.println();
System.out.println();
OutUtil.say("这是bulider3");
Headman.getHeadman().doBulid(new Bulider3());
}
}
5测试结果
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
---------------------这是bulider1--------------------------
---------------------start--------------------------
---------------------Bulider1--------------------------
---------------------doing--------------------------
---------------------Bulider1--------------------------
---------------------ended--------------------------
---------------------Bulider1--------------------------
---------------------这是bulider2--------------------------
---------------------start--------------------------
---------------------Bulider1--------------------------
---------------------start--------------------------
---------------------Bulider2--------------------------
---------------------doing--------------------------
---------------------Bulider1--------------------------
---------------------doing--------------------------
---------------------Bulider2--------------------------
---------------------ended--------------------------
---------------------Bulider1--------------------------
---------------------ended--------------------------
---------------------Bulider2--------------------------
---------------------这是bulider3--------------------------
---------------------start--------------------------
---------------------Bulider1--------------------------
---------------------start--------------------------
---------------------Bulider2--------------------------
---------------------start--------------------------
---------------------Bulider3--------------------------
---------------------doing--------------------------
---------------------Bulider1--------------------------
---------------------doing--------------------------
---------------------Bulider2--------------------------
---------------------doing--------------------------
---------------------Bulider3--------------------------
---------------------ended--------------------------
---------------------Bulider1--------------------------
---------------------ended--------------------------
---------------------Bulider2--------------------------
---------------------ended--------------------------
---------------------Bulider3--------------------------
6.总结
我们发现建造者模式中有意思的一点:
**
不管你的建造者怎么变,建造者模式中的工头是不变的,而且,我们在测试方法中使用建造者,并不是直接使用的,而是通过工头的建造方法来使用建造者的开始进行结束方法的。
所以,我们就可以把现在完成的项目打包,等到有新的需要时,继承建造者或者实现接口,就可以在原有的基础上修改。
同时,使用建造者模式,避免了一种情况。当我们需要扩充方法时,无需打开我们原有的方法的源代码,因为没有任何对原有建造者源代码的直接操作,所以,使用建造者模式扩充时,原有的建造者可以保证其完整性和正确性。
**