设计模式之创建者模式Builder

创建者模式

场景

  • 我们要建造一个复杂的产品,比如:神州飞船、Iphone。这个复杂的产品的创建,有这样一个问题需要处理装配这些字子组件是不是有个步骤问题
  • 实际开发中,我们所需要的对象构建是,也非常复杂,有很多步骤需要处理时
 
建造模式的本质
分离了对象子组件的单独构造(有Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象,这个模式适用于:某个对象的构建过程复杂的情况下使用
由于实现了构建和装配的解耦,不同的构造器,相同的装配,也可以做出不同的对象;相同的构建起,不同的装配顺序也可以做出不同的对象;也就是实现了构建算法,装配算法的解耦,实现了更好的复用
结构
  • Builder 抽象建造者接口,规范各个组成部分的构建。
  • ConcreteBuilder 具体建造者角色,实现组成部分的构建,并提供示例。
  • Product 产品角色,创建返回的对象。
  • Director 导演者角色,负责创建以及使用。

结构图

 

代码示例

/**
 * 宇宙飞船
 */
public class AirShip {

    private OrbitalModule orbitalModule ;//轨道舱模块
    private Engine engine; //发动机
    private EscapePower escapePower; //逃逸塔

    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 EscapePower getEscapePower() {
        return escapePower;
    }

    public void setEscapePower(EscapePower escapePower) {
        this.escapePower = escapePower;
    }
}

class OrbitalModule{

    String orbitalNme;

    public OrbitalModule(String orbitalNme) {
        super();
        this.orbitalNme = orbitalNme;
    }

    public String getOrbitalNme() {
        return orbitalNme;
    }

    public void setOrbitalNme(String orbitalNme) {
        this.orbitalNme = orbitalNme;
    }
}

class Engine{

    private String engineName;

    public Engine(String engineName) {
        this.engineName = engineName;
    }

    public String getEngineName() {
        return engineName;
    }

    public void setEngineName(String engineName) {
        this.engineName = engineName;
    }
}

class EscapePower{

    private String escapePowerName ;

    public EscapePower(String escapePowerName) {
        this.escapePowerName = escapePowerName;
    }

    public String getEscapePowerName() {
        return escapePowerName;
    }

    public void setEscapePowerName(String escapePowerName) {
        this.escapePowerName = escapePowerName;
    }
}

 
 

/**
 * 构建子组件
 */
public interface AirShipBuilder {
    Engine builderEgine();
    OrbitalModule builderOrbitalModule();
    EscapePower builderEscapePower();
}

public class SxtAirShipBuilder implements AirShipBuilder {
    @Override
    public Engine builderEgine() {
        System.out.println("构建发动机");
        return new Engine("发动机");
    }

    @Override
    public OrbitalModule builderOrbitalModule() {
        System.out.println("构建轨道舱模块");
        return new OrbitalModule("轨道舱模块");
    }

    @Override
    public EscapePower builderEscapePower() {
        System.out.println("构建逃逸塔");
        return new EscapePower("逃逸塔");
    }
}
/**
 * 装配
 */
public interface AirShipDirector {
    /**
     * 组装airship
     * @return
     */
    AirShip directorAirShip();
}


/**
 * 组装宇宙飞船  装备者调用构建者创建对象
 */
public class SxtAirShipDirector implements AirShipDirector {
    AirShipBuilder builder;

    public SxtAirShipDirector(AirShipBuilder builder) {
        this.builder = builder;
    }

    @Override
    public AirShip directorAirShip() {
        Engine engine =builder.builderEgine();
        OrbitalModule orbitalModule = builder.builderOrbitalModule();
        EscapePower escapePower =builder.builderEscapePower();
        //组装
        AirShip airShip = new AirShip();
        airShip.setEngine(engine);
        airShip.setEscapePower(escapePower);
        airShip.setOrbitalModule(orbitalModule);
        return airShip;
    }
}
public class Client {
    public static void main(String[] args){

        AirShipBuilder builder = new SxtAirShipBuilder();
        AirShipDirector director = new SxtAirShipDirector(builder);
        AirShip ship = director.directorAirShip();

        System.out.println(ship.getEngine().getEngineName());
        System.out.println(ship.getOrbitalModule().getOrbitalNme());
        System.out.println(ship.getEscapePower().getEscapePowerName());

    }
}

 开发中的应用场景

  • StringBuilder类的append方法
  • SQL中的PrepareStatement
  • JDOM中,DomBuilder、SAXBuilder 

猜你喜欢

转载自jenny-run.iteye.com/blog/2298217