场景
- 需要建造一个复杂的产品,有许多子组件,装配步骤。
建造者模式本质:
- 分离了对象子组件的单独构造(builder负责)和装配(Director负责),从而构造出复杂的对象,模式适用于,某个对象构建过程复杂。
- 由于实现了构建和装配的解耦,不同的构建器,相同的装配,也可以做出不同的对象,相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法,装配算法的解耦,实现更好的复用。
假设现在构建一个飞船对象,对象属性有引擎对象(engine),逃离塔对象(escapeTower),轨道舱对象(orbitaModule)
飞船类
public class Airship{
pricate OrbitaModule orbitaModule;
pricate Engine engine;
pricate EscapeTower escapeTower;
getter,setter...省略
}
轨道舱对象
public class OrbitaModule {
private string name;
}
引擎对象
public class Engine {
private string name;
}
逃离塔对象
public class EscapeTower {
private string name;
}
- AirshipBuilder接口
public interface AirshipBuilder{
Engine builderEngine();
OrbitaModule builderOrbitaModule();
EscapeTower builderEscapeTower();
}
- AirshipDirector接口
pubilc interface AirshipDirector{
/**组装飞船对象
*/
Airship directorAirShip();
}
- SxtAirshipBuilder 实现了AirshipBuilder
public class SxtAirshipBuilder implements AirshipBuilder {
public Engine builderEngine(){
return new Engine();
//此处经常使用工厂模式 来获取组件对象
}
OrbitaModule builderOrbitaModule(){
return new OrbitaModule();
}
EscapeTower builderEscapeTower(){
return newEscapeTower();
}
}
一般设计模式都是搭配起来用,构建者模式实现里面 获取组件的时候,经常使用工厂模式来获取组件,就如上面获取public Engine builderEngine()里面,经常使用工厂获取组件对象。
- SxtAirshipDirector 实现了AirshipDirctor
public class SxtAirshipDirector implements AirshipDirctor{
private AirshipBuilder airshipBuilder;
//构造器传入AirshipBuilder
public SxtAirshipDirector(AirshipBuilder airshipBuilder){
this.airshipBuilder=airshipBuilder
}
@Override
public Airship directAirShip(){
//获取组件
Engine engine = airshipBuilder.builderEngine();
OrbitalModule module = airshipBuilder.builderOrbitalModule();
EscapeTower tower=airshipBuilder.builderEscapeTower();
//装配对象
Airship airship = new Airship();
airship.setEngine(engine);
airship.setOrbitalModule(module);
airship.setEscapeTower(tower);
return airship;
}
}
Client不必知道灰色部分的复杂构建过程。
开发中应用场景
- StringBuilder类的append()方法
- SQL中的PreparedStatement
- JDOM中,DomBuilder,SAXBuilder
在框架中有一些构建者模式,是企业级应用中,一般没有这么复杂的对象需要建造者模式。