builer模式中主要有两个角色,一个是builder(相当于底层的建筑工人),一个是director(相当于设计师)。builder负责提供构建对象各个部分的功 能以及最后组装对象的功能,而director负责调用builder的功能来创建对象。
Builder:为创建Product对象的各个部件指定抽象接口。
ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
Director:构造一个使用Builer接口的对象。
Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,以及将这些部件装配成最终产品的接口。
来一个栗子吧~
世界上有各种各样的车子,有的车子四个轮子,有的车子八个轮子,有的车子敞篷,有的车子好几个窗户,我来写一个建造一个有四个轮子的有蓬四个窗户的小轿车。
/**
* Created with IntelliJ IDEA.
* User: Administrator
* Date: 14-3-11
* Time: 下午7:48
* To change this template use File | Settings | File Templates.
*/
public class Car{
public int getNumofwheels() {
return numofwheels;
}
public void setNumofwheels() {
this.numofwheels++;
}
public int getNumofwindows() {
return numofwindows;
}
public void setNumofwindows() {
this.numofwindows++;
}
public boolean isIschangpeng() {
return ischangpeng;
}
public void setIschangpeng() {
this.ischangpeng = true;
}
private int numofwheels=0;
private int numofwindows=0;
private boolean ischangpeng=false;
public Car(){
System.out.println("我在建造一个车子");
}
}
public abstract class CarBuilder {
public abstract void buildWheels();
public abstract void buildWindows();
public abstract Car getCar();
}
/**
* Created with IntelliJ IDEA.
* User: Administrator
* Date: 14-3-11
* Time: 下午7:53
* To change this template use File | Settings | File Templates.
*/
public class smallCar extends CarBuilder{
Car smallCar;
@Override
public void buildWheels(){
smallCar.setNumofwheels();
smallCar.setNumofwheels();
smallCar.setNumofwheels();
smallCar.setNumofwheels();
}
@Override
public void buildWindows(){
smallCar.setNumofwindows();
smallCar.setNumofwindows();
smallCar.setNumofwindows();
smallCar.setNumofwindows();
}
@Override
public Car getCar(){
smallCar =new Car();
buildWheels();
buildWindows();
return smallCar;
}
}
public class smallCarDerector {
public static void creatSmallCar(CarBuilder smallCar) {
smallCar.buildWindows();
smallCar.buildWheels();
}
}
public class Test {
public static void main(String []args){
CarBuilder carBuilder=new smallCar();
Car small=carBuilder.getCar();
smallCarDerector.creatSmallCar( carBuilder);
}
}
优点如下:
1、将一个复杂对象的创建过程封装起来。
2、解耦了组装过程和创建具体部件,使得我们不用去关心每个部件是如何组装的。--上面对自行车的分析可以很清楚的看出这点。
3、向客户隐藏产品内部的表现。
4、产品的实现可以被替换,因为客户只看到一个抽象的接口。
缺点如下:
1、经常被用来创建组合结构。
用途
1、需要生成的产品对象有复杂的内部结构。
2、需要生成的产品对象的属性相互依赖,建造者模式可以强迫生成顺序。
3、在对象创建过程中会使用到系统中的一些其它对象,这些对象在产品对象的创建过程中不易得到。
实现要点
1、建造者模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
2、产品不需要抽象类,特别是由于创建对象的算法复杂而导致使用此模式的情况下或者此模式应用于产品的生成过程,其最终结果可能差异很大,不大可能提炼出一个抽象产品类。
3、创建者中的创建子部件的接口方法不是抽象方法而是空方法,不进行任何操作,具体的创建者只需要覆盖需要的方法就可以,但是这也不是绝对的,特别是类似文本转换这种情况下,缺省的方法将输入原封不动的输出是合理的缺省操作。
4、前面我们说过的抽象工厂模式(AbtractFactory)解决“系列对象”的需求变化,Builder模式解决“对象部分”的需求变化,建造者模式常和组合模式(Composite Pattern)结合使用。