设计模式之创建者模式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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值