建造模式的本质:
分离
了对象子组件的单独构造
(由Builder来负责)和装配
(由Director负责)。从而可以构造出复杂的对象
。这个模式适用于:某个对象的构建过程复杂的情况下使用。- 由于
实现了构建和装配的解耦
。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。也就实现了构建算法、装配算法的解耦,实现了更好的复用。
适用场景:
建造的对象,被建造时流程非常复杂,而且有各种组件,组件间还有关系,组件还要先组装后组装再组装等。
开发中应用场景:
- StringBuilder类的append方法
- SQL中的PreparedStatement
- JDOM中,DomBuilder、SAXBuilder
该模式在一般开发中不多见。
同样,“见名知意”,一般以“Builder”结尾的都用到建造者模式,如StringBuilder、学习XML解析中,JDOM库中的类:DomBuilder、SaxBuilder…
【示例】飞船的建造
步骤一:飞船实体类。此处各组件均用相应的类表示,模拟真实情况。
AirShip.java
/**
* 宇宙飞船
* @author 枫枫
*
*/
public class AirShip {//处于真实--用类模拟
private OrbitalMoudle orbitalMoudle; //轨道舱
private Engine engine; //发动机
private EscapeTower escapeTower; //逃逸塔
public void launch() {//此处就可以调用发动机、轨道舱等等组件
System.out.println("发射");
System.out.println("调用"+engine.getName());;
}
public OrbitalMoudle getOrbitalMoudle() {
return orbitalMoudle;
}
public void setOrbitalMoudle(OrbitalMoudle orbitalMoudle) {
this.orbitalMoudle = orbitalMoudle;
}
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 OrbitalMoudle{
private String name;
public OrbitalMoudle(String name) {
super(); //加不加无所谓,加了必在第一行
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) {
super();
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) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
步骤二:构建者Builder接口及实现类
AirShipBuilder.java
public interface AirShipBuilder {
Engine builderEngine();
OrbitalMoudle builderOrbitalMoudle();
EscapeTower builderEscapeTower();
}
BJ_AirShipBuilder.java 北京牌飞船构建者
public class BJ_AirShipBuilder implements AirShipBuilder{
@Override
public Engine builderEngine() {
System.out.println("构建发动机");
return new Engine("北京牌发动机"); //此处可结合工厂模式,调用工厂生产单个产品,下同;也可单例模式
}
@Override
public OrbitalMoudle builderOrbitalMoudle() {
System.out.println("构建轨道舱");
return new OrbitalMoudle("北京牌轨道舱");
}
@Override
public EscapeTower builderEscapeTower() {
System.out.println("构建逃逸塔");
return new EscapeTower("北京牌逃逸塔");
}
}
步骤三:组装者Director接口及实现类
AirShipDirector.java
public interface AirShipDirector {
/**
* 组装飞船对象
* @return
*/
AirShip directAirShip();
}
BJ_AirShipDirectory.java 北京牌飞船组装者
public class BJ_AirShipDirector implements AirShipDirector{
private AirShipBuilder builder; //获得构建者对象的引用
public BJ_AirShipDirector(AirShipBuilder builder) {//在构建装配者时传入构建者对象,就可以使用builder了
super();
this.builder = builder;
}
@Override
public AirShip directAirShip() {
//通过构建者对象的引用,构建各种组件
Engine e = builder.builderEngine();
OrbitalMoudle o = builder.builderOrbitalMoudle();
EscapeTower et = builder.builderEscapeTower();
//装配成飞船对象
AirShip ship = new AirShip();
ship.setEngine(e);
ship.setEscapeTower(et);
ship.setOrbitalMoudle(o);
return ship;
}
}
步骤四:客户端(调用者)
public class Client {
public static void main(String[] args) {
AirShipDirector director = new BJ_AirShipDirector(new BJ_AirShipBuilder());
AirShip ship = director.directAirShip();
System.out.println(ship.getEngine().getName());
//飞船已经建成,可调用其相关的方法
ship.launch();
}
}
对应UML类图:
难点在于各种模式的混合使用。