一、使用场景
我们要建造一个复杂的产品。比如:神舟飞船。这个复杂产品的创建,有这样一个问题需要处理:装配这些子组件是不是有个步骤问题?
实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理。
对象被建造的过程非常复杂,组件的构建非常复杂,这时候可以考虑使用构建者模式。
例:StringBuilder类中的append方法。
SQL中的PreparedStatement
JDOM中的Dombuilder、SAXBuilder
二、建造者模式的本质
1、分离了对象子组件的单独构造(builder来负责)和装配(Director负责)。从而可以构造出复杂的对象。这个模式使用于:某个对象的构建过程复杂的情况下使用。
2、由于实现了构建和装配的解耦。不同的构建器,相同的装配也可以做出不同的对象;相同的构建器,不同的装配也可以做出不同的对象。也就是实现了构建算法和装配算法的解耦,实现了更好的复用。
三、使用实例(产品:飞船)
package com.meimei.builder;
/**
* Created by Administrator on 2018/1/21.
*/
public class Airship {
/**
* 飞船的三个子组件
*/
private OrbitalModule orbitalModule;
private EscapeTower escapeTower;
private Engine engine;
public void launch(){
System.out.println("发射!");
}
public EscapeTower getEscapeTower() {
return escapeTower;
}
public void setEscapeTower(EscapeTower escapeTower) {
this.escapeTower = escapeTower;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public OrbitalModule getOrbitalModule() {
return orbitalModule;
}
public void setOrbitalModule(OrbitalModule orbitalModule) {
this.orbitalModule = orbitalModule;
}
}
class OrbitalModule{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public OrbitalModule(String name) {
this.name = name;
}
}
class Engine{
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
public Engine(String name) {
this.name = name;
}
}
class EscapeTower{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public EscapeTower(String name) {
this.name = name;
}
}
package com.meimei.builder;
/**
* Created by Administrator on 2018/1/21.
*/
public interface AirshipBuilder {
OrbitalModule builderOrbitalModule();
Engine builderEngine();
EscapeTower builderEscapeTower();
}
package com.meimei.builder;
/**
* Created by Administrator on 2018/1/21.
* 组装飞船的接口
*/
public interface AirshipDirector {
Airship directorAirship();
}
package com.meimei.builder;
/**
* Created by Administrator on 2018/1/21.
* 常见的构建者模式StringBuilder 、XML解析
*/
public class DFHAirshipBuilder implements AirshipBuilder{
@Override
public OrbitalModule builderOrbitalModule() {
System.out.println("构建轨道舱");
return new OrbitalModule("构建东方红轨道舱!");
}
@Override
public Engine builderEngine() {
System.out.println("构建发动机");
return new Engine("构建东方红发动机!");
}
@Override
public EscapeTower builderEscapeTower() {
System.out.println("构建逃逸塔");
return new EscapeTower("构建东方红逃逸塔!");
}
}
package com.meimei.builder;
/**
* 东方红装配者
* Created by Administrator on 2018/1/21.
*/
public class DFHAirshipDirector implements AirshipDirector {
private AirshipBuilder airshipBuilder;
public DFHAirshipDirector(AirshipBuilder airshipBuilder) {
this.airshipBuilder = airshipBuilder;
}
@Override
public Airship directorAirship() {
Engine engine = airshipBuilder.builderEngine();
EscapeTower escapeTower = airshipBuilder.builderEscapeTower();
OrbitalModule orbitalModule = airshipBuilder.builderOrbitalModule();
//装配成飞船对象
Airship airship = new Airship();
airship.setEngine(engine);
airship.setEscapeTower(escapeTower);
airship.setOrbitalModule(orbitalModule);
return airship;
}
}
package com.meimei.builder;
/**
* Created by Administrator on 2018/1/21.
*/
public class Client {
public static void main(String[] args){
AirshipDirector director = new DFHAirshipDirector(new DFHAirshipBuilder());
Airship ship = director.directorAirship();
System.out.println(ship.getEngine().getName());
System.out.println(ship.getEscapeTower().getName());
System.out.println(ship.getOrbitalModule().getName());
ship.launch();
}
}
四、UML类图如下