从简单的对象一步一步构造一个复杂的对象,这就叫做构建模式。它是属于创建设计模式之一,也挺常用的。
适用场合和好处:
- 仅仅通过指定它的类型和内容来生成一个复杂的对象,而这个构造的对象隐藏在它的构建细节。
- 想分离构建一个复杂对象的过程。
- 为构造和呈现而隔离代码
- 给予你更好的控制构造(construction)过程。
对于组合(Composite), 它经常用来构建一个复杂的对象,而构建模式则强调从简单的对象构建一个复杂的对象。
分析一个实例,如下:
假如有一个构建房屋的程序,有几个造房子的步骤,完成这些步骤就好。
House.java类
public class House {
private String type = null;
private List features = new ArrayList();
public House() {
}
public House(String type) {
this.type = type;
}
public void setType(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setProgress(String s) {
features.add(s);
}
public String toString() {
StringBuffer ff = new StringBuffer();
String t = type.substring(6);
ff.append(t + "\n ");
int size = features.size();
for (int i = 0; i < size; i++) {
ff.append(features.get(i) + "\n ");
}
return ff.toString();
}
}
定义一个房子构造抽象类HouseBuilder.java.
abstract class HouseBuilder {
protected House house = new House();
//show the building info
protected String showProgress() {
return house.toString();
}
abstract public void buildFoundation();
abstract public void buildFrame();
abstract public void buildExterior();
abstract public void buildInterior();
}
它的子类Skyscraper.java
public class Skyscraper extends HouseBuilder {
Skyscraper(String type){
System.out.println("--Building the house "+ type);
house.setType(this.getClass() +" :"+ type);
}
@Override
public void buildFoundation() {
//doEngineering()
//doExcavating()
//doPlumbingHeatingElectricity()
//doSewerWaterHookUp()
//doFoundationInspection()
house.setProgress("foundation is done");
}
@Override
public void buildFrame() {
//doHeatingPlumbingRoof()
//doElectricityRoute()
//doDoorsWindows()
//doFrameInspection()
house.setProgress("frame is done");
}
@Override
public void buildExterior() {
//doOverheadDoors()
//doBrickWorks()
//doSidingsoffitsGutters()
//doDrivewayGarageFloor()
//doDeckRail()
//doLandScaping()
house.setProgress("Exterior is waiting to start");
}
@Override
public void buildInterior() {
//doBuiltinVacuum()
//doInsulation()
//doDryWall()
//doPainting()
//doLinoleum()
//doCabinet()
//doTileWork()
//doLightFixtureBlinds()
//doCleaning()
//doInteriorInspection()
house.setProgress("Interior is not started yet");
}
}
public class Workshop{
public void construct(HouseBuilder builder){
builder.buildFoundation();
builder.buildFrame();
builder.buildExterior();
builder.buildExterior();
}
}
测试这个构造模式,代码如下:
public class Builder {
public static void main(String []args){
System.out.println("---- Builder Pattern ---------");
//initialize two house builder objects
HouseBuilder skyscraperOne = new Skyscraper("************Telnet");
HouseBuilder skyscraperTwo = new Skyscraper("****************DongDu");
//build the workspace for the project
Workshop workshop = new Workshop();
workshop.construct(skyscraperOne);
workshop.construct(skyscraperTwo);
//show the building information
System.out.println("---check the building-----");
System.out.println(skyscraperOne.showProgress());
System.out.println(skyscraperTwo.showProgress());
}
}
结果如下:
---- Builder Pattern ---------
--Building the house ************Telnet
--Building the house ****************DongDu
---check the building-----
org.pattern.rationaljava.creationalpattern.Skyscraper :************Telnet
foundation is done
frame is done
Exterior is waiting to start
Exterior is waiting to start
org.pattern.rationaljava.creationalpattern.Skyscraper :****************DongDu
foundation is done
frame is done
Exterior is waiting to start
Exterior is waiting to start