场景:
我们需要建造一个复杂的产品。比如:神舟飞船、iphone。这些复杂的产品创建。有这样一个问题需要处理:装配这些子组件是不是有个步骤问题?
在实际开发中,什么所需要的对象构建时,也非常复杂,有很多步骤需要处理时。
建造模式的本质:
分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法与装配算法的解耦,实现了更好的复用。
下面用建造飞船的例子来说明:
//创建飞船类和对应的模块类
package com.note.pattern.build;
//飞船类
public class AirShip {
private OrbitalModule orbitalModule;// 轨道舱
private Engine engine;// 发动机
private EscapeTower escapeTower;// 逃逸塔
public void launch() {
System.out.println("发射!");
}
public OrbitalModule getOrbitalModule() {
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
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 Engine {
private String name;
public Engine(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;
}
}
//创建Builder接口与其实现类
package com.note.pattern.build;
public interface AirShipBuilder {
OrbitalModule buildOrbitalModule();
Engine buildEngine();
EscapeTower buildEscapeTower();
}
package com.note.pattern.build;
public class ChinaAirShipBuild implements AirShipBuilder{
@Override
public OrbitalModule buildOrbitalModule() {
System.out.println("构建中国牌轨道舱!");
return new OrbitalModule("中国牌轨道舱");
}
@Override
public Engine buildEngine() {
System.out.println("构建中国牌发动机!");
return new Engine("中国牌发动机");
}
@Override
public EscapeTower buildEscapeTower() {
System.out.println("构建中国牌逃逸塔!");
return new EscapeTower("中国牌逃逸塔");
}
}
//创建Director接口与实现类,负责组装:
package com.note.pattern.build;
public interface AirShipDirector {
//组装飞船对象
AirShip directAirShip();
}
package com.note.pattern.build;
public class ChinaAirShipDirector implements AirShipDirector{
private AirShipBuilder builder;
public ChinaAirShipDirector(AirShipBuilder builder) {
this.builder = builder;
}
@Override
public AirShip directAirShip() {
Engine e = builder.buildEngine();
OrbitalModule o = builder.buildOrbitalModule();
EscapeTower et = builder.buildEscapeTower();
//装配成飞船对象
AirShip ship = new AirShip();
ship.setEngine(e);
ship.setEscapeTower(et);
ship.setOrbitalModule(o);
return ship;
}
}
//客户端使用
package com.note.pattern.build;
public class Client {
public static void main(String[] args) {
AirShipDirector director = new ChinaAirShipDirector(new ChinaAirShipBuild());
AirShip airShip = director.directAirShip();
System.out.println(airShip.getEngine().getName());
airShip.launch();
}
}
开发中应用场景:
StringBuild类的append方法
Sql中的PreparedStatement
JDOM中,DomBuilder、SAXBuilder