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

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


前言

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

摘要

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

建造者模式

概念

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

结构

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

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

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

应用场景

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

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

建造者模式优缺点

优点

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

缺点

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

建造者模式的示例

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

产品(Product)

java 复制代码
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)

java 复制代码
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 )

java 复制代码
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)

java 复制代码
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类:负责构建产品的对象,指挥具体建造者进行产品的构建。该类包含了构建产品的算法。

测试用例

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

java 复制代码
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());
    }
}

测试结果如下:

测试用例代码解读:

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

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

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

小结

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

附录源码

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

总结

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

☀️建议/推荐你

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

📣关于我

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


相关推荐
用坏多个鼠标几秒前
Nacos和Nginx集群,项目启动失败问题
java·开发语言
TangKenny20 分钟前
基于EasyExcel的动态列映射读取方案
java·easyexcel
安冬的码畜日常22 分钟前
【JUnit实战3_19】第十章:用 Maven 3 运行 JUnit 测试(下)
java·测试工具·junit·单元测试·maven·junit5
lemon_sjdk32 分钟前
软件开发模式架构选择
java·架构·软件开发·前后端分离
董广明1 小时前
单元测试(JUnit、Mockito、PowerMock )
java·经验分享·junit·单元测试
Lisonseekpan1 小时前
Java Stream 流式编程
java·后端
沐浴露z1 小时前
Kafka Consumer 消费流程详解
java·分布式·kafka
程序员小假1 小时前
运行时有出现过什么异常?
java·后端
凤山老林1 小时前
还在用JDK8?JDK8升级JDK11:一次价值千万的升级指南
java·开发语言·jvm·spring boot·后端·jdk
lang201509282 小时前
Apache Maven 项目的开发指南
java·maven·apache