「聊设计模式」之建造者模式(Builder)

举报
bug菌 发表于 2023/09/25 17:57:44 2023/09/25
【摘要】 建造者模式是一种对象创建型设计模式。它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。


🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!


大家下午好,我是bug菌,今天我们继续聊设计模式。

前言

  设计模式是众多优秀软件开发实践的总结和提炼,是软件工程中不可或缺的重要内容。其中建造者模式是一种非常常用的设计模式,本文将介绍建造者模式的概念、结构、应用场景、代码实现以及测试用例。

摘要

  建造者模式是一种对象创建型设计模式。它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。

建造者模式

概念

  建造者模式是一种对象创建型设计模式,它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。该模式将构建对象的过程分为若干个部分,分别进行构建,最终通过一个指挥者将这些部分组装成一个完整的对象。该模式可以解决复杂对象的创建和表示问题,同时可以提高代码的重用性和可维护性。

结构

建造者模式包含如下几个角色:

  • Product(产品):表示要创建的复杂对象。
  • Builder(抽象建造者):定义创建产品各个部分的抽象接口。
  • ConcreteBuilder(具体建造者):实现抽象建造者接口,完成产品的各个部分的构建。
  • Director(指挥者):负责构建产品的对象,指挥具体建造者进行产品的构建。

如下是建造者模式的UML类图:

image.png

应用场景

建造者模式适用于以下场景:

  • 创建对象的算法应该独立于组成部分以及它们的装配方式时。
  • 同一个构建过程有不同的表示时。
  • 需要创建一些复杂的对象,但是它们的部分构造过程必须有一定的顺序时。
  • 需要在对象创建过程中进行更加精细的控制时。

模式优缺点

优点

  • 将对象的构建与表示分离,使得同样的构建过程可以创建不同的表示,增加了程序的灵活性;
  • 将复杂对象的构造代码与表示代码分开,易于维护;
  • 隐藏了对象构建的细节,使得构建代码与表示代码分离,提高了代码的可读性和可维护性;
  • 可以对不同的具体建造者进行更换和扩展。

缺点

  • 由于需要定义抽象建造者和具体建造者类,因此建造者模式增加了系统的类的个数,导致系统更加庞大。

建造者模式实现

以下是建造者模式的代码实现,以Java语言为例:

产品(Product)

package com.example.javaDesignPattern.builder;

/**
 * 产品
 *
 * @Author bug菌
 * @Date 2023-09-19 0:00
 */
public class Product {
    private String partA;
    private String partB;
    private String partC;

    public String getPartA() {
        return partA;
    }

    public void setPartA(String partA) {
        this.partA = partA;
    }

    public String getPartB() {
        return partB;
    }

    public void setPartB(String partB) {
        this.partB = partB;
    }

    public String getPartC() {
        return partC;
    }

    public void setPartC(String partC) {
        this.partC = partC;
    }

    public String toString() {
        return "PartA: " + partA + ", PartB: " + partB + ", PartC: " + partC;
    }
}

抽象建造者(Builder)

package com.example.javaDesignPattern.builder;

/**
 * 抽象建造者(Builder)
 *
 * @Author bug菌
 * @Date 2023-09-19 0:03
 */
public interface Builder {
    void buildPartA();

    void buildPartB();

    void buildPartC();

    Product getResult();
}

具体建造者(ConcreteBuilder )

package com.example.javaDesignPattern.builder;

/**
 * 具体建造者(ConcreteBuilder )
 *
 * @Author bug菌
 * @Date 2023-09-19 0:03
 */
public class ConcreteBuilder implements Builder {
    private Product product = new Product();

    public void buildPartA() {
        product.setPartA("A");
    }

    public void buildPartB() {
        product.setPartB("B");
    }

    public void buildPartC() {
        product.setPartC("C");
    }

    public Product getResult() {
        return product;
    }
}

指挥者(Director)

package com.example.javaDesignPattern.builder;

/**
 * 指挥者(Director)
 *
 * @Author bug菌
 * @Date 2023-09-19 0:03
 */
public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

代码方法介绍

  • Product类:表示要创建的复杂对象。该类包含了对象的各个部分,并提供了设置和获取各个部分的方法。
  • Builder接口:定义创建产品各个部分的抽象接口。包含了创建每个部分的抽象方法以及获取最终产品的方法。
  • ConcreteBuilder类:实现Builder接口,完成产品的各个部分的构建。
  • Director类:负责构建产品的对象,指挥具体建造者进行产品的构建。该类包含了构建产品的算法。

测试用例

以下是建造者模式的测试用例:

package com.example.javaDesignPattern.builder;

/**
 * @Author bug菌
 * @Date 2023-09-19 0:05
 */
public class BuilderPattern {

    public static void main(String[] args) {

        Director director = new Director();
        Builder builder = new ConcreteBuilder();
        director.construct(builder);
        Product product = builder.getResult();

        System.out.println(product.getPartA());
        System.out.println(product.getPartB());
        System.out.println(product.getPartC());

        System.out.println(product.toString());
    }
}

测试结果如下:

image.png

测试用例代码解读:

  这是一个实现Builder设计模式的示例代码。Builder模式的目的是将对象的构建过程与表示分离,从而使同样的构建过程可以创建出不同的表示形式。下面是代码的解读:

  1. 首先定义了一个 Builder 接口,ConcreteBuilder 类实现了 Builder 接口。
  2. Product 类是最终要构建的对象。
  3. Director 类是建造者模式中的指挥者,用于构造 Product 对象。
  4. 在 main 方法中,先创建了一个 ConcreteBuilder 对象,在调用 Director 的 construct 方法时传入该 builder。Director 会调用 ConcreteBuilder 的具体方法来构造 Product。
  5. 最后通过 getResult 方法获取 Product 对象,并输出其三个部分的值,以及使用 toString 方法输出 Product对象的所有属性。

  这个建造者模式的示例比较简单,但是建造者模式常用于构建较为复杂的对象,例如生成 HTML 页面、构建复杂的数据库查询等。通过建造者模式可以降低对象构建的复杂度,使代码更易于维护。

小结

  本文介绍了建造者模式的概念、结构、应用场景和代码实现。在建造者模式中,将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。建造者模式适用于复杂对象的创建和表示问题,以及需要更加精细的控制的场景。在代码实现中,需要定义产品类、抽象建造者接口、具体建造者类和指挥者类,分别完成产品的各个部分的构建和产品的组装。最后,通过测试用例验证建造者模式的正确性。

附录源码

  如上涉及代码均已上传同步在GitHub,提供给同学们参考性学习。

总结

  建造者模式是一种非常常用的设计模式,它将复杂对象的构建过程分离出来,使得同样的构建过程可以创建不同的表示。通过该模式,可以减少构建过程中的重复代码,提高代码的重用性和可维护性。该模式适用于复杂对象的创建和表示问题,以及需要更加精细的控制的场景。在实际开发中,建议合理运用建造者模式,提高代码的质量和可维护性。

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。