「聊设计模式」之建造者模式(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 对象,在调用 Director 的 construct 方法时传入该 builder。Director 会调用 ConcreteBuilder 的具体方法来构造 Product。
  5. 最后通过 getResult 方法获取 Product 对象,并输出其三个部分的值,以及使用 toString 方法输出 Product对象的所有属性。

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

小结

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

附录源码

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

总结

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

☀️建议/推荐你

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

📣关于我

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


相关推荐
程序猿DD3 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
蛋蛋的就会顺顺的5 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
余槐i5 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8266 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡6 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
凤山老林7 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne8 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF8 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
silvamux_8 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
pride.li9 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉