建造模式的本质:
-分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构 造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
-由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配 算法的解耦,实现了更好的复用。
/**
* 宇宙飞船
*/
public class AirShip {
private OrbitalModule orbitalModule; //轨道舱
private EngineModule engineModule;//发动机
private EscapeTower escapeTower;//逃逸塔
public AirShip(){
}
public void lauch(){
System.out.println("-------------点火发射了!!!!---------------");
}
public AirShip(OrbitalModule orbitalModule, EngineModule engineModule, EscapeTower escapeTower) {
this.orbitalModule = orbitalModule;
this.engineModule = engineModule;
this.escapeTower = escapeTower;
}
public OrbitalModule getOrbitalModule() {
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
}
public EngineModule getEngineModule() {
return engineModule;
}
public void setEngineModule(EngineModule engineModule) {
this.engineModule = engineModule;
}
public EscapeTower getEscapeTower() {
return escapeTower;
}
public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
}
class OrbitalModule {
private String name;
public OrbitalModule(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class EngineModule {
private String name;
public EngineModule(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class EscapeTower {
private String name;
public EscapeTower(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//-------------------------------
public interface AirShipBuilder {
OrbitalModule builderOrbitalModule();
EngineModule builderEngineModule();
EscapeTower builderEscapeTower();
}
//-------------------------------
public class BubbleTgAirShipBuilder implements AirShipBuilder{
@Override
public OrbitalModule builderOrbitalModule() {
System.out.println("----BubbleTgAirShipBuilder--------构建BubbleTg轨道舱--------------");
return new OrbitalModule("这是构建好多了的BubbleTg轨道舱");
}
@Override
public EngineModule builderEngineModule() {
System.out.println("----BubbleTgAirShipBuilder--------构建BubbleTg发动机--------------");
return new EngineModule("这是构建好多了的BubbleTg发动机");
}
@Override
public EscapeTower builderEscapeTower() {
System.out.println("----BubbleTgAirShipBuilder--------构建BubbleTg逃逸塔--------------");
return new EscapeTower("这是构建好多了的BubbleTg逃逸塔");
}
}
//-------------------------------
/**
* 负责组装
*/
public interface AirShipDirector {
/**
* 组装飞船对象
* @return
*/
AirShip directAirShip();
}
//-------------------------------
/**
*装配者,组装
*/
public class BubbleTgAirshipDirector implements AirShipDirector {
private AirShipBuilder builder;
public BubbleTgAirshipDirector(AirShipBuilder builder) {
this.builder = builder;
}
@Override
public AirShip directAirShip() {
EngineModule e = builder.builderEngineModule();
OrbitalModule o = builder.builderOrbitalModule();
EscapeTower et = builder.builderEscapeTower();
System.out.println("--------BubbleTgAirshipDirector---开始装配组装-----------");
//装配成飞船对象
AirShip ship= new AirShip();
ship.setEngineModule(e);
ship.setEscapeTower(et);
ship.setOrbitalModule(o);
return ship;
}
}
//-------------------------------
public class builderPatternTest01 {
public static void builderPatternTest(){
System.out.println("----------------------------构建者模式演示开始------------------------------------");
AirShipDirector director = new BubbleTgAirshipDirector(new BubbleTgAirShipBuilder());
AirShip ship = director.directAirShip();
System.out.println(ship.getEngineModule().getName());
System.out.println(ship.getEscapeTower().getName());
System.out.println(ship.getOrbitalModule().getName());
System.out.println("-------------------一切就绪------------------");
ship.lauch();
System.out.println("----------------------------构建者模式演示结束------------------------------------");
}
}
开发中应用场景:
-StringBuilder类的append方法
-SQL中的PreparedStatement
-JDOM中,DomBuilder、SAXBuilder