美文网首页
建造者模式

建造者模式

作者: 会思考的鸭子 | 来源:发表于2017-07-09 16:27 被阅读0次

场景:

当做一个复杂的产品时,我们需要将他们按照一定的步骤组件起来

建造者模式的本质

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

代码角度的理解

具体的产品可以理解成一个Java Bean,它里面的属性也是由各个java对象组成。我们要在客户端直接生成这个Java Bean,首先有一个Builder类拿到这个Java Bean的各个属性,再有一个Director类将拿到的各个属性对Java Bean对象进行组装(调用Java Bean属性的各个set方法)

UML(Java Bean 是一个宇宙飞船)

image.png

具体实现代码,参照UML图

java bean:

package com.amberweather.builder;

/**
 * 
 * 一个java bean,每个属性都是一个类
 * @author HT
 *
 */
public class AirShip {
    private OrbitalModule orbitalModule;
    private Engine engine;
    private EscapeTower escapeTower;
    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 OrbitalModule(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;
    }
}

Buidler的接口:

package com.amberweather.builder;
/**
 * 
 * java bean的各个属性获取
 * @author HT
 *
 */
public interface AirShipBuilder {
    Engine buildeEngine();
    OrbitalModule buildeOrbitalModule();
    EscapeTower buildeEscapeTower();
}

组装接口:

package com.amberweather.builder;

/**
 * 
 * 组装接口
 * @author HT
 *
 */
public interface AirShipDirector {
    AirShip direcAirShip();
}

Builder 的具体实现:

package com.amberweather.builder;
/**
 * 
 * java bean的各个属性获取的具体实现类
 * @author Administrator
 *
 */
public class AmberAirShipBuilder implements AirShipBuilder {

    @Override
    public Engine buildeEngine() {
        System.out.println("构建发动机");
        return new Engine("AmberWeather 发动机");      //可以和其他模式结合
    }

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

    @Override
    public EscapeTower buildeEscapeTower() {
        System.out.println("构建逃逸塔");
        return new EscapeTower("AmberWeather 逃逸塔");
    }

}

组装类Director的具体实现:

package com.amberweather.builder;

/**
 * director组装类的具体实现
 *
 * @author Administrator
 *
 */
public class AmberAirShipDirector implements AirShipDirector {

    private AirShipBuilder builder;
    
    
    public AmberAirShipDirector(AirShipBuilder builder) {
        super();
        this.builder = builder;
    }


    @Override
    public AirShip direcAirShip() {
        Engine engine = builder.buildeEngine();
        OrbitalModule orbitalModule = builder.buildeOrbitalModule();
        EscapeTower escapeTower = builder.buildeEscapeTower();
        AirShip ariship = new AirShip();
        ariship.setEngine(engine);
        ariship.setOrbitalModule(orbitalModule);
        ariship.setEscapeTower(escapeTower);
        return ariship;
    }

}

客户端代码:

package com.amberweather.builder;

public class client {

    public static void main(String[] args) {
        AirShipDirector director = new AmberAirShipDirector(new AmberAirShipBuilder());
        
        AirShip airship = director.direcAirShip();
        System.out.println(airship.getEngine().getName());
    }
}

相关文章

  • Builder Pattern in Java

    建造者模式:建造者模式定义建造者模式应用场景实现案例Jdk中的建造者模式建造者模式的优点建造者模式的缺点 建造者模...

  • 设计模式(4) 建造者模式

    什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与...

  • 建造者模式(部件构造)

    目录 建造者模式的理念 从 POJO 到建造者模式的思考 怎么来实现建造者模式 建造者模式在Android源码中的...

  • 【设计模式】之建造者Builder模式

    建造者模式 什么是建造者模式? 建造者模式属于创建型模式的一员,可以控制对象的实例化过程。建造者模式简化了复杂对象...

  • 建造者模式

    一、建造者模式介绍 二、建造者模式代码实例

  • 建造者模式

    建造者模式 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和...

  • 建造者模式:深入理解建造者模式 ——组装复杂的实例

    目录: 一 建造者模式介绍 1.1 定义 1.2 为什么要用建造者模式(优点)? 1.3 哪些情况不要用建造者模式...

  • 设计模式之建造者模式

    设计模式之建造者模式 Intro 简介 建造者模式: 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加...

  • 一、设计模式(构建模式)——03建造模式与原型模式

    建造者模式 建造型模式用于创建过程稳定,但配置多变的对象。 建造模式的实现要点: 在建造者模式中,指挥者是直接与客...

  • 创建型模式:建造者模式

    个人公众号原文:创建型模式:建造者模式 五大创建型模式之四:建造者模式。 简介 姓名 :建造者模式 英文名 :Bu...

网友评论

      本文标题:建造者模式

      本文链接:https://www.haomeiwen.com/subject/croshxtx.html