设计模式小抄(二) -- 建造者模式

栏目: 后端 · 发布时间: 5年前

内容简介:建造者模式(builder)是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离开来。建造者模式角色:抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和buildPart2),另一种是返还结构方法(retrieveResult)。

建造者模式(builder)是创建一个复杂对象的创建型模式,将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离开来。

UML结构

设计模式小抄(二) -- 建造者模式

建造者模式角色:

抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart1和buildPart2),另一种是返还结构方法(retrieveResult)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少 零件,就有多少相应的建造方法。

具体建造者(ConcreteBuilder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:1.实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。2.在建造过程完成后,提供产品的实例。

导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。

产品(Product)角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

实例代码

目录结构:

设计模式小抄(二) -- 建造者模式

Porsche

我们使用建造者模式, 创建一辆 保时捷(Porsche) 来溜达溜达,大体上一辆车主要有以下属性(简单列举了几个)

public class Porsche {
    //引擎
    private String engine;
    //气缸
    private String cylinder;
    //车架
    private String frame;

    // 省略 get/set method
}
复制代码

Builder

抽象Builder类, 列举我们在创建一辆车过程中,需要安装哪些部件

public abstract class Builder {
    public abstract void buildEngine(String engine);

    public abstract void buildCylinder(String cylinder);

    public abstract void buildFrame(String frame);

    public abstract Porsche create();
}

复制代码

PorscheBuilder

具体实现创建的方法,用于创建车辆

public class PorscheBuilder extends Builder {

    private Porsche porsche = new Porsche();


    public void buildEngine(String engine) {
        porsche.setEngine(engine);
    }

    public void buildCylinder(String cylinder) {
        porsche.setCylinder(cylinder);
    }

    public void buildFrame(String frame) {
        porsche.setFrame(frame);
    }

    public Porsche create() {
        return porsche;
    }
}
复制代码

Director

指挥官, 负责创建过程中的流程编排

public class Director {
    private Builder builder;

    public Director(Builder builder) {
        this.builder = builder;
    }

    public Porsche createPorsche(String engine, String cylinder, String frame) {
        builder.buildEngine(engine);
        builder.buildCylinder(cylinder);
        builder.buildFrame(frame);
        return builder.create();
    }
}
复制代码

客户端调用

class create {
    public static void main(String[] args) {
        Builder builder = new PorscheBuilder();
        Director director = new Director(builder);
        //组装车辆
        director.createPorsche("engine","cylinder","frame");
    }
}
复制代码

特性

使用场景

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 相同的方法,不同的执行顺序,产生不同的事件结果时。
  • 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。
  • 创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,但是对象的内部组成构件面临着复杂的变化。

优缺点

  • 优点: 使用建造者模式可以使客户端不必知道产品内部组成的细节。 具体的建造者类之间是相互独立的,容易扩展。 由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。
  • 缺点: 产生多余的Build对象以及Dirextor类。

参考:

哆啦A梦-传送门 哆啦A梦-传送门


以上所述就是小编给大家介绍的《设计模式小抄(二) -- 建造者模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能革命

智能革命

李彦宏 等 / 中信出版集团 / 2017-5-1 / 68.00元

人类历史上的历次技术革命,都带来了人类感知和认知能力的不断提升,从而使人类知道更多,做到更多,体验更多。以此为标准,李彦宏在本书中将人工智能定义为堪比任何一次技术革命的伟大变革,并且明确提出,在技术与人的关系上,智能革命不同于前几次技术革命,不是人去适应机器,而是机器主动来学习和适应人类,并同人类一起学习和创新这个世界。“人工智能”正式写入2017年政府工作报告,折射出未来人工智能产业在我国经济发......一起来看看 《智能革命》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具