建造者模式
23种设计模式
1.建造者模式解决的问题
当我们处理比较复杂的问题时,很难一次性的解决,或者当问题比较复杂,一次性难以完成时。
建造者模式提供一个在原基础上不断扩充的模式,我们可以在上次的基础上增加一些的新的内容。
最终,完成较为复杂的需要。
建造者模式不断扩充。
另一种理解:
看书上的意思应该是同一个流程实现不同的产品,其实我个人觉得,这里和模板方法以及工厂模式等等非常的类似。
注意:本文所写可能与大多数其他的建造者解释有所不同,请注意。
2.建造者模式中的角色
1.建造:接口类型,主要定义了建造者最核心的,必须实现的方法。
2.工头:建造接口的使用者,主要作用就是协调建造接口中核心方法的调用
3.建造者:建造接口的扩充类或者上一个建造者的继承类。
3.建造者模式的调用过程
1.在测试类中调用工头的建造方法
2.在工头的建造方法中会要求传入一个建造者
3.按照工头方法中的顺序调用建造者的建造方法
4建造者实例
4.1角色说明
建造接口:
Bulid
建造者:
Bulider#
(#代表建造者的标识,比如Bulider1,Bulider2…)
工头:
Headman
工具:
OutUtil
4.2建造接口:
public interface Build {
void startBulid(String string);
void buliding(String string);
void endBulid(String string);
}
4.3工头
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
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
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
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工具类
public class OutUtil {
public static void say(String string){
System.out.println("---------------------"+string+"--------------------------");
}
}
4.8测试方法
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测试结果
---------------------这是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.总结
我们发现建造者模式中有意思的一点:
不管你的建造者怎么变,建造者模式中的工头是不变的,而且,我们在测试方法中使用建造者,并不是直接使用的,而是通过工头的建造方法来使用建造者的开始进行结束方法的。
所以,我们就可以把现在完成的项目打包,等到有新的需要时,继承建造者或者实现接口,就可以在原有的基础上修改。
同时,使用建造者模式,避免了一种情况。当我们需要扩充方法时,无需打开我们原有的方法的源代码,因为没有任何对原有建造者源代码的直接操作,所以,使用建造者模式扩充时,原有的建造者可以保证其完整性和正确性。
23种设计模式