设计模式——3.建造者模式

场景:
– 我们要建造一个复杂的产品。比如:神州飞船,Iphone。这个复杂的产品的创建。有这样 一个问题需要处理:
• 装配这些子组件是不是有个步骤问题?
– 实际开发中,我们所需要的对象构建时,也非常复杂,有很多步骤需要处理时。

• 建造模式的本质:
– 分离了对象子组件的单独构造(由Builder来负责)装配(由Director负责)。 从而可以构 造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况下使用。
– 由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象; 相同的构建器,不同的装配顺序也可以做出不同的对象。也就是实现了构建算法、装配 算法的解耦,实现了更好的复用。

构建“尚学堂牌”神舟飞船的示例

对象 宇宙飞船,抽象出三个子组件,可以飞行

package com.bjsxt.builder;
//
public class AirShip {
    private OrbitalModule orbitalModule;// 轨道舱
    private Engine engine;// 发动机
    private EscapeTower escapeTower;// 逃逸塔
    public void fly(){
        System.out.println("飞行");
    }
    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 EscapeTower getEscapeTower() {
        return escapeTower;
    }

    public void setEscapeTower(EscapeTower escapeTower) {
        this.escapeTower = escapeTower;
    }
}
class OrbitalModule{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
class Engine{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
class EscapeTower{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

构建复杂对象子组件使用一个构建者,抽象为一个接口,可以有不同构建实现类。

package com.bjsxt.builder;

public interface AirShipBuilder {// 建造者
    Engine builderEngine();
    OrbitalModule builderOrbitalModule();
    EscapeTower builderEscapeTower();
}

子组件按照一定步骤组装成对象,抽象为一个接口,可以有不同组装实现类。

package com.bjsxt.builder;

public interface AirShipDirector {// 组装者
    AirShip directAirShip();
}

尚学堂牌构建者

package com.bjsxt.builder;

public class SxtAirShipBuilder implements AirShipBuilder {
    @Override
    public Engine builderEngine() {
        System.out.println("建造者建造发动机");
        Engine engine = new Engine();
        engine.setName("尚学堂牌发动机");
        return engine;
    }

    @Override
    public OrbitalModule builderOrbitalModule() {
        System.out.println("建造者建造轨道舱");

        OrbitalModule orbitalModule = new OrbitalModule();
        orbitalModule.setName("尚学堂牌轨道舱");
        return orbitalModule;
    }

    @Override
    public EscapeTower builderEscapeTower() {
        System.out.println("建造者建造逃逸塔");

        EscapeTower escapeTower = new EscapeTower();
        escapeTower.setName("尚学堂牌逃逸塔");
        return escapeTower;
    }
}

尚学堂牌组装者

package com.bjsxt.builder;

public class SxtAirShipDirector implements AirShipDirector {
    // 从建造者获取零件
    private AirShipBuilder airShipBuilder;
    // 给调用者提供构造方法赋值

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

    @Override
    public AirShip directAirShip() {
        System.out.println("组装者按步骤组装发动机,轨道舱,逃逸塔");
        AirShip airShip = new AirShip();
        Engine e = airShipBuilder.builderEngine();
        EscapeTower escapeTower = airShipBuilder.builderEscapeTower();
        OrbitalModule orbitalModule = airShipBuilder.builderOrbitalModule();
        airShip.setEngine(e);
        airShip.setEscapeTower(escapeTower);
        airShip.setOrbitalModule(orbitalModule);
        return airShip;
    }
}

调用者

package com.bjsxt.builder;

public class Client {
    public static void main(String[] args) {
        AirShipDirector sxtAirShipDirector = new SxtAirShipDirector(new SxtAirShipBuilder());
        AirShip airShip = sxtAirShipDirector.directAirShip();

        System.out.println(airShip.getEngine().getName());
        airShip.fly();
    }
}

uml图:
在这里插入图片描述
运行结果
在这里插入图片描述

开发中应用场景:
– StringBuilder类的append方法
– SQL中的PreparedStatement
– JDOM中,DomBuilder、SAXBuilder

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值