建造者模式的本质
- 分离了对象子组件的单独构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。此模式适用于构建某个具有复杂过程的对象。
- 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序,也可以做出不同的对象。也就是实现了构建算法、装配算法的解耦,实现了更好的复用。
- 一般与工厂模式合作使用。零件来自工厂创建,由构建器组装。
建造者模式使用场景
- 要建造一个复杂的产品,比如:神舟飞船、苹果手机,那这些复杂产品的创建,就有这样一个问题需要处理:装配这些子组件的步骤问题?
- 实际开发中,我们所需要的对象构建时,也很复杂,需要很多步骤需要处理时。
飞船建造
我们在这里假设要建造一宇宙飞船AirShip,它具有发动机Engine,轨道舱OrbitalModule,逃逸塔EscapeTower,代码如下:
/**
* User:tumbler
* Desc:建造者模式--发动机类
*/
public class Engine {
private String name;
public Engine(String name) {
this.name = name;
}
//getter/setter略
}
**
* User:tumbler
* Desc:建造者模式--轨道舱类
*/
public class OrbitalModule {
private String name;
public OrbitalModule(String name) {
this.name = name;
}
//getter/setter略
}
/**
* User:tumbler
* Desc:建造者模式--逃逸塔类
*/
public class EscapeTower {
private String name;
public EscapeTower(String name) {
this.name = name;
}
//getter/setter略
}
/**
* User:tumbler
* Desc:构建者模式--宇宙飞船类
*/
public class AirShip {
private OrbitalModule orbitalModule; // 轨道舱
private Engine engine; // 发动机
private EscapeTower escapeTower; //逃逸塔
public void launch(){
System.out.println("发射!!!");
}
//getter/setter略
}
那么我们客户端并不需要知道这些细节,它只要告诉我需要什么牌的飞船,你建造者给我造就行了,那么就需要一个构造器接口AirShipBuilder,一个组装器接口AirShipDirector。我们再建两个实现类不倒翁牌的飞船构造器和组装器,代码如下:
/**
* User:tumbler
* Desc:建造者模式--飞船构造器接口
*/
public interface AirShipBuilder {
/**
* 建造具体发动机
*/
Engine builderEngine();
OrbitalModule builderOrbitalModule();
EscapeTower builderEscapeTower();
}
/**
* User:tumbler
* Desc:建造者模式--建造不倒翁牌飞船
*/
public class TumblerAirShipBuilder implements AirShipBuilder {
@Override
public Engine builderEngine() {
System.out.println("构建不倒翁牌发动机...");
return new Engine("不倒翁牌发动机!"); //这里可以结合使用单例模式或者工厂模式
}
@Override
public OrbitalModule builderOrbitalModule() {
System.out.println("构建不倒翁牌轨道舱...");
return new OrbitalModule("不倒翁牌轨道舱!");
}
@Override
public EscapeTower builderEscapeTower() {
System.out.println("构建不倒翁牌逃逸塔...");
return new EscapeTower("不倒翁牌逃逸塔!");
}
}
/**
* User:tumbler
* Desc:建造者模式--组装器接口
*/
public interface AirShipDirector {
/**
* 组装飞船对象
* @return
*/
AirShip directAirShip();
}
/**
* User:tumbler
* Desc:构建者模式--不倒翁牌组装器
*/
public class TumblerAirShipDirector implements AirShipDirector{
// 使用构建器
private AirShipBuilder builder;
public TumblerAirShipDirector(AirShipBuilder builder) {
this.builder = builder;
}
@Override
public AirShip directAirShip() {
Engine engine = builder.builderEngine();
OrbitalModule orbitalModule = builder.builderOrbitalModule();
EscapeTower escapeTower = builder.builderEscapeTower();
AirShip airShip = new AirShip();
airShip.setEngine(engine);
airShip.setEscapeTower(escapeTower);
airShip.setOrbitalModule(orbitalModule);
return airShip;
}
}
客户端调用来获得不倒翁牌飞船:
/**
* User:tumbler
* Desc:建造这模式--客户端测试
*/
public class Client {
public static void main(String[] args) {
AirShipDirector director = new TumblerAirShipDirector(new TumblerAirShipBuilder());
AirShip airShip = director.directAirShip();
airShip.launch(); //飞船创建成功,调用方法
}
}
飞船构造UML图
组装过程如此复杂,但是客户端调用却变得简单。
常见应用
- StringBuilder类的append方法
- SQL中的PreparedStatement
- JDOM中,DomBuilder、SAXBuilder