深入浅出设计模式 - 建造者模式

news2024/11/18 13:39:47

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

在这里插入图片描述

文章目录

  • 1、什么是建造者模式
  • 2、建造者模式有什么优缺点
  • 3、建造者模式的应用场景
  • 4、建造者模式的结构
  • 5、建造者模式的代码案例

1、什么是建造者模式

建造者模式是一种创建型设计模式,它可以将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式可以通过一步一步地构建复杂对象来简化其构建过程,并且可以在构建过程中灵活地添加或删除组件。建造者模式的核心思想是将对象的构建过程分解为多个步骤,每个步骤由一个具体的建造者来实现,最终由一个指挥者来协调建造者的执行顺序以创建对象。

2、建造者模式有什么优缺点

建造者模式的优点包括:

  1. 可以将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

  2. 可以通过一步一步地构建复杂对象来简化其构建过程,并且可以在构建过程中灵活地添加或删除组件。

  3. 可以提高代码的复用性,因为不同的建造者可以共享相同的构建过程。

  4. 可以提高代码的可读性和可维护性,因为每个具体建造者负责构建一个组件,使得代码更加清晰。

  5. 可以避免类爆炸问题,因为不同的组件可以由不同的具体建造者来构建,而不是通过继承来实现。

建造者模式的缺点包括:

  1. 建造者模式需要创建多个类,因此会增加代码量。

  2. 如果产品的组件非常多,那么建造者模式的构建过程可能会变得非常复杂。

  3. 如果产品的组件发生变化,那么需要修改建造者的代码,可能会影响整个系统的稳定性。

  4. 建造者模式需要使用指挥者来协调建造者的执行顺序,可能会增加系统的复杂性。

总的来说,建造者模式适用于需要构建复杂对象的场景,可以将构建过程分解为多个步骤,使得代码更加清晰、可维护。但是需要权衡其优缺点,选择合适的设计模式来解决问题。

3、建造者模式的应用场景

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

  1. 需要创建复杂对象的场景,例如汽车、电脑、手机等,这些对象的构建过程往往需要多个步骤,并且每个步骤可能有多种实现方式。

  2. 需要创建对象的表示与构建过程分离的场景,例如通过 XML 文件或者数据库记录来构建对象。

  3. 需要创建不同表示的对象的场景,例如通过相同的构建过程来创建不同的 HTML 页面。

  4. 需要在构建过程中灵活地添加或删除组件的场景,例如通过构建器来构建菜单或者表单。

  5. 需要提高代码的复用性和可读性的场景,例如通过建造者模式来构建图形用户界面组件。

建造者模式适用于需要构建复杂对象的场景,可以将构建过程分解为多个步骤,使得代码更加清晰、可维护。

4、建造者模式的结构

建造者模式通常包含以下几个角色:

  1. 产品(Product):需要被构建的复杂对象,通常由多个组件组成。

  2. 抽象建造者(Builder):定义了创建产品各个部件的抽象接口,通常包含多个方法用于构建不同的组件。

  3. 具体建造者(ConcreteBuilder):实现了抽象建造者接口,负责具体的产品构建过程,通常包含多个方法用于构建不同的组件。

  4. 指挥者(Director):负责协调建造者的执行顺序,以完成产品的构建过程。

5、建造者模式的代码案例

下面是一个简单的建造者模式示例代码:
首先定义产品类 Product ,包含多个组件:

package com.pany.camp.design.principle.build;

/**
 *
 * @description:  产品类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:27
 */
public class Product {
    private String partA;
    private String partB;
    private String partC;

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

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

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

    public void show() {
        System.out.println("PartA: " + partA);
        System.out.println("PartB: " + partB);
        System.out.println("PartC: " + partC);
    }
}

然后定义抽象建造者接口 Builder ,包含多个方法用于构建不同的组件:

package com.pany.camp.design.principle.build;

/**
 *
 * @description:  抽象建造者接口
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 12:28
 */
public interface Builder {

    void buildPartA();

    void buildPartB();

    void buildPartC();

    Product getResult();
}

接着定义具体建造者类 ConcreteBuilder ,实现了抽象建造者接口,负责具体的产品构建过程:

package com.pany.camp.design.principle.build;

/**
 *
 * @description:  具体建造者类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:29 
 */
public class ConcreteBuilder implements Builder {
    
    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.setPartA("PartA");
    }

    @Override
    public void buildPartB() {
        product.setPartB("PartB");
    }

    @Override
    public void buildPartC() {
        product.setPartC("PartC");
    }

    @Override
    public Product getResult() {
        return product;
    }
}

最后定义指挥者类 Director ,负责协调建造者的执行顺序,以完成产品的构建过程:

package com.pany.camp.design.principle.build;

/**
 *
 * @description:  指挥者类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:29 
 */
public class Director {
    
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
        builder.buildPartC();
    }
}

客户端代码可以通过指挥者来构建产品:

package com.pany.camp.design.principle.build;

/**
 *
 * @description:  客户端类
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:30
 */
public class Client {
    
    public static void main(String[] args) {
        Director director = new Director();
        Builder builder = new ConcreteBuilder();
        director.construct(builder);
        Product product = builder.getResult();
        product.show();
    }
}

我们可以看到建造者模式的核心思想:将复杂对象的构建过程分解为多个步骤,每个步骤由一个具体的建造者来实现,最终由一个指挥者来协调建造者的执行顺序以创建对象,从而实现了复杂对象的构建与表示分离的目的。

输出如下:

PartA: PartA
PartB: PartB
PartC: PartC

Process finished with exit code 0

在这里插入图片描述

💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/695758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fatal: not a git repository (or any of the parent directories): .git 解决方案

fatal: not a git repository (or any of the parent directories): .git致命:不是git存储库(或任何父目录):.git 解决办法: 在命令行 输入 git init 然后回车就好了 git init

JSON-TO-PROTOBUF

url https://json2pb.vercel.app/

PMP认证考试的价值和前景:值得投资吗?

因为我身边很多小伙伴都在纠结考个PMP证书要花小一万,完事到底值不值得投资这个问题?那咱们今的主题就是浅说一下PMP考试的价值和前景叭~ PMP的价值 1.PMP证书能够适用于很多行业,就业范围比较广,比如航天、通讯、电子、计算机、…

【雕爷学编程】Arduino动手做(132)---KY-027魔术光环模块

7款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&…

UDP套接字的通信(实现英汉互译/程序替换/多线程聊天室/Windows与Linux通信)

实现英汉互译 思路 我们在客户端发英文,服务端做翻译工作,让翻译好的中文再次发给我们的客户端,然后打印出来。 服务端代码 翻译的操作 创建一个txt文件里面包含英汉互译的数据 dict.txt banana:香蕉 apple:苹果 pig:猪 beef:牛肉 hello…

Liux上使用POI将Word转PDF中文字体无法显示问题解决

错误信息: Windows测试下载PDF没有任何问题,打包上传Linux服务器以后下载PDF只显示数字。 解决方法: 1、Word转换PDF成功但是中文显示不出都是因为字体的问题 下面的方法简单粗暴,但是解决了我的问题: a、将C:\Wind…

面试官:“你还有什么想问我的吗?”(攻略版,建议收藏系列)

面试官:“你还有什么想问我的吗?”(攻略版,建议收藏系列) 此类问题大致分为三种情形:部门负责人面、HR面、高层领导面。 一、部门负责人面 【判断自己的业务能力和性格特点是否与岗位匹配度高】 此时&am…

ADB usage

查看手机设备的信息 获取设备的Android版本号 adb shell getprop ro.build.version.release 获取设备的API版本号 adb shell getprop ro.build.version.sdkAdb 获得 sdk版本 adb shell getprop ro.build.version.sdk27 Adb 获得Android版本 adb shell getprop ro.build.vers…

深入了解glibc的互斥锁的加锁过程

深入了解glibc的互斥锁 互斥锁是多线程同步时常用的手段,使用互斥锁可以保护对共享资源的操作。共享资源也被称为临界区,当一个线程对一个临界区加锁后,其他线程就不能进入该临界区,直到持有临界区锁的线程释放该锁。 本文以gli…

品达通用权限系统-Day03

文章目录 1. 概述2. lombok(编码效率工具)2.1 lombok 简介2.2 安装lombok插件2.3 lombok常用注解2.4 lombok入门案例 3. Nacos(服务注册和配置中心)4. Redis(Windows版安装及使用) 1. 概述 本节主要讲述&a…

同城上门送酒小程序 uniapp用户端+vue/php后端+商家端+配送端源码

前端uniapp 跨平台框架 后端php vue.js框架 php7.2 mysql数据库 mysql5.6 <template> <view> <view id"mainPage" :style"{height:MainPageHeightrpx}"> <PageHome v-show"showPageinitIndex" …

序列到序列学习

将最后时刻的隐藏状态传给解码器。特定的“”表示序列开始词元&#xff0c;表示开始翻译。将此次翻译的结果作为下一次的输入&#xff0c;并将隐藏状态传递给下一时刻。最后可以拿到整个语言句子的输出。 将编码器最后一次的隐藏状态与解码器的第一次的输入&#xff0c;放在一…

工具篇9--Window 虚拟机安装

文章目录 前言一、虚拟机是什么&#xff1f;二、虚拟机安装1.下载虚拟机软件&#xff1a;2.下载centos 系统镜像&#xff1a;3.虚拟机安装&#xff1a;3.1 关闭杀毒软件&#xff1a;3.2 重启后继续安装&#xff1a;3.3 修改vm 安装的位置&#xff1a;3.4 勾掉用户体验后下一步完…

PostgreSQL Log 日志模块详解

本文讲的是操作日志&#xff0c;非 WAL 日志。 文章目录 背景日志模块原理Syslogger 核心模块日志消息通信日志轮转问题一问题二问题三问题四问题五 存在的问题刷盘性能日志轮转 参考资料 背景 PG 的日志模块是一个相对独立的模块&#xff0c;主要功能就是打印用户的操作日志以…

【MATLAB第46期】基于MATLAB的改进模糊卷积神经网络IFCNN分类预测模型

【MATLAB第46期】基于MATLAB的改进模糊卷积神经网络IFCNN多分类预测模型 一、展示效果 二、思路 在正常CNN卷积神经网络训练阶段之后&#xff0c;使用进化算法&#xff08;蜜蜂算法&#xff09;拟合深度学习权重和偏差。 本文案例数据中&#xff0c; 用深度模型进行4分类预测…

vmware安装centos将home磁盘合并至root下

使用vmware安装centos后&#xff0c;发现分的盘60G&#xff0c;其中有17G分到了home盘&#xff0c;现在想只用一个盘进行统一管理&#xff0c;于是将home盘删除掉&#xff0c;再合并到root盘下&#xff0c;这里是直接删除掉home,没有备份数据&#xff0c;步骤如下&#xff1a; …

时间表R(t) 和 学习曲线learning curve

import numpy as np import matplotlib.pyplot as plt# 设置参数 a1 2 a2 0.1 a3 0.1 a4 1 T 10# 生成曲线数据 t np.linspace(0, 20, 1000) y np.exp(-a2 * t**a1) a3 * (t / T)**a4# 绘制曲线 plt.plot(t, y) plt.xlabel(t) plt.ylabel(R(t)) plt.title(Evolution of…

亚马逊云科技发起“可持续发展伙伴计划” ,实现降本增效、安全合规的上云价值

6月27日&#xff0c;“2023亚马逊云科技中国峰会”在上海世博中心盛大启幕&#xff01; 在与全球客户的交流中&#xff0c;亚马逊云科技发现很多企业都在三个方面不断创建未雨绸缪&#xff1a;首先&#xff0c;降本增效&#xff1b;其次&#xff0c;保证业务安全合规&#xff…

vscode如何创建自定义快捷键模板(typescript React示例)

1.vs面板左下角设置-配置用户代码片段 2. 弹出搜索框中输入typescript会出来2个选项&#xff0c;选择第二个react 3.在代码片段中添加自己的快捷键设置片段&#xff08;用$TM_FILENAME_BASE$1可以获取当前文件的名称&#xff09; {// Place your snippets for typescriptreact…

python基础案例题(进制转换、字符串加密的实现、猜拳游戏、多种方法计算π)

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 环境使用: Python 3.8 Pycharm 专业版 1.进制转换 功能&#xff1a;获取十进制整数的二进制串&#xff0c;相当于内置函数bin。 算法分析&#xff1a; 对2辗转相除&#xff0c;直到商为0 每次所得余数逆序即可 流程图…