【创建型设计模式】建造者模式

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【创建型设计模式】建造者模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

建造者模式

这是本人第一次学习建造者模式,浅谈下自己的理解和展示下demo

理解

定义:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

建造者模式实现了组件的构造(Builder)和装配(Director)的分离
构造的不同或者装配的不同都可以导致最后得到不同的对象

举个例子:我们要组装一个火箭,火箭的结构分为轨道舱、逃逸塔和引擎
我们分别让不同的厂家负责这些零件的生产和装配

代码样例

首先我们定义一个火箭的对象实体类
为了贴合实际开发,我们将各个零件都定义为类,并简单赋予其name属性

public class AirShip {
    /**
     * 轨道模块
     */
    private OrbitalModule orbitalModule;

    /**
     * 引擎
     */
    private Engine engine;

    /**
     * 逃逸塔
     */
    private EscapeTower escapeTower;

    /**
     * 发射方法
     */
    public void launch() {
        System.out.println("起飞!");
    }

    public AirShip(OrbitalModule orbitalModule, Engine engine, EscapeTower escapeTower) {
        this.orbitalModule = orbitalModule;
        this.engine = engine;
        this.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) {
        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) {
        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) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

然后我们来定义生产零件的厂家(也就是Builder)
简单设计一个接口和对应的实现类

public interface AirShipBuilder {
    /**
     * 创建引擎
     * @return 返回引擎对象
     */
    Engine createEngine();

    /**
     * 创建逃逸塔
     * @return 返回逃逸塔对象
     */
    EscapeTower createEscapeTower();

    /**
     * 创建轨道模块
     * @return 返回轨道模块对象
     */
    OrbitalModule createOrbitalModule();
}

public class AirBuilderImpl implements AirShipBuilder{
    @Override
    public Engine createEngine() {
        System.out.println("创建引擎");
        return new Engine("十年牌引擎");
    }

    @Override
    public EscapeTower createEscapeTower() {
        System.out.println("创建逃逸塔");
        return new EscapeTower("十年牌逃逸塔");
    }

    @Override
    public OrbitalModule createOrbitalModule() {
        System.out.println("创建轨道舱");
        return new OrbitalModule("十年牌轨道舱");
    }
}

下一步,我们需要装配这些零件的部门(也就是Director)

public interface AirShipDirect {
    /**
     * 装配零件组成火箭
     * @return 返回飞船
     */
    AirShip createAirShip();
}

public class AirShipDirectImpl implements AirShipDirect{

    private AirBuilderImpl airShipBuilder;

    /**
     * 构造方法,因为需要从生产者那里获取零件,所以我们把生产者当作参数传进来
     * @param airShipBuilder 生产者
     */
    public AirShipDirectImpl(AirBuilderImpl airShipBuilder) {
        this.airShipBuilder = airShipBuilder;
    }

    @Override
    public AirShip createAirShip() {
        Engine engine = airShipBuilder.createEngine();
        EscapeTower escapeTower = airShipBuilder.createEscapeTower();
        OrbitalModule orbitalModule = airShipBuilder.createOrbitalModule();

        return new AirShip(orbitalModule, engine, escapeTower);
    }
}

最后,我们作为客户,只需要和生产部门和组装部门打交道就行
完全不需要关心火箭生产组装过程中的具体实现

public class Client {
    public static void main(String[] args) {
        // 只需和装配者以及生产者打交道,就能得到飞船了
        AirShipDirectImpl airShipDirect = new AirShipDirectImpl(new AirBuilderImpl());
        AirShip airShip = airShipDirect.createAirShip();
        airShip.launch();
        System.out.println("这个飞船的引擎是:" + airShip.getEngine().getName());
    }
}

最后的运行结果如下
在这里插入图片描述
如有错误,欢迎指正

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136823.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!