23种设计模式之建造者模式(Builder Pattern)

news2024/11/28 2:47:52

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的建造者模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

以下正文开始

文章目录

  • 建造者模式概念
  • 建造者模式优缺点
  • 建造者模式案例

在这里插入图片描述

建造者模式概念

建造者模式是一种创建型设计模式,它允许我们将一个复杂对象的构建步骤分离出来,使得同样的构建过程可以创建不同的表示。该模式的目的是将构建复杂对象的过程抽象化,从而减少代码的重复和复杂度

在建造者模式中,我们通过Builder接口或抽象类定义了一个标准的构建流程,然后让不同的具体构造者按照这个标准来实现自己的构建流程。同时,我们还定义了一个指导者(Director)类,用于按照特定的顺序执行构建流程,从而完成对象的构建。

建造者模式优缺点

建造者模式的优点在于:

  1. 将构建复杂对象的过程封装起来,简化了代码结构和逻辑。

  2. 不同的具体构造者可以实现不同的构建流程,使得同样的构建过程可以创建不同的表示。

  3. 指导者类可以根据需要按照特定的顺序执行构建流程,从而达到更好的控制和管理对象的构建。

建造者模式的缺点在于:

  1. 添加新的部件需要修改抽象类和具体构造者的代码。

  2. 如果对象的属性较少,使用建造者模式可能会显得过于复杂,不如直接使用工厂方法模式或简单工厂模式。

总之,建造者模式适用于需要创建对象复杂且变化多端的情景,它能够将对象的构建过程标准化,从而达到代码重用和简化的目的。

建造者模式案例

首先我们创建一个电脑抽象类Computer和各个部件的抽象类Part,其中包含它们的基本属性及get和set方法。

public abstract class Computer {
    protected String mBoard;
    protected String mCpu;
    protected String mRam;
    protected String mHardDisk;

    public void setBoard(String board) {
        this.mBoard = board;
    }

    public void setCpu(String cpu) {
        this.mCpu = cpu;
    }

    public void setRam(String ram) {
        this.mRam = ram;
    }

    public void setHardDisk(String hardDisk) {
        this.mHardDisk = hardDisk;
    }

    public abstract String toString();
}

public abstract class Part {
    protected String mName;

    public void setName(String name) {
        this.mName = name;
    }

    public String getName() {
        return mName;
    }
}

然后我们定义一个Builder接口,包含构建各个部件的方法,如buildBoard、buildCpu等。

public interface Builder {
    void buildBoard(String board);
    void buildCpu(String cpu);
    void buildRam(String ram);
    void buildHardDisk(String hardDisk);
    Computer createComputer();
}

接着我们定义三种不同的具体构造者:AsusBuilder、DellBuilder和HPBuilder,它们分别实现了Builder接口,并且实现了构建各个部件的方法,根据不同的要求返回不同的部件对象。

public class AsusBuilder implements Builder {
    private Computer mComputer = new AsusComputer();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildCpu(String cpu) {
        mComputer.setCpu(cpu);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setRam(ram);
    }

    @Override
    public void buildHardDisk(String hardDisk) {
        mComputer.setHardDisk(hardDisk);
    }

    @Override
    public Computer createComputer() {
        return mComputer;
    }
}

public class DellBuilder implements Builder {
    private Computer mComputer = new DellComputer();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildCpu(String cpu) {
        mComputer.setCpu(cpu);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setRam(ram);
    }

    @Override
    public void buildHardDisk(String hardDisk) {
        mComputer.setHardDisk(hardDisk);
    }

    @Override
    public Computer createComputer() {
        return mComputer;
    }
}

public class HPBuilder implements Builder {
    private Computer mComputer = new HPComputer();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildCpu(String cpu) {
        mComputer.setCpu(cpu);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setRam(ram);
    }

    @Override
    public void buildHardDisk(String hardDisk) {
        mComputer.setHardDisk(hardDisk);
    }

    @Override
    public Computer createComputer() {
        return mComputer;
    }
}

最后我们定义一个Director类,它含有一个Builder对象,以及按照固定的顺序执行构建流程的方法buildComputer。通过调用Director的buildComputer方法,我们便可以创建出一个完整的电脑对象。

public class Director {
    private Builder mBuilder;

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

    public void buildComputer(String board, String cpu, String ram, String hardDisk) {
        mBuilder.buildBoard(board);
        mBuilder.buildCpu(cpu);
        mBuilder.buildRam(ram);
        mBuilder.buildHardDisk(hardDisk);
    }
}

最后我们定义三个具体的电脑类AsusComputer、DellComputer和HPComputer,它们分别继承自Computer抽象类,实现了toString方法,用于打印电脑对象的属性。

public class AsusComputer extends Computer {
    @Override
    public String toString() {
        return "Asus Computer [Board=" + mBoard + ", CPU=" + mCpu + ", RAM=" + mRam + ", HardDisk="
                + mHardDisk + "]";
    }
}
public class DellComputer extends Computer {
    @Override
    public String toString() {
        return "Dell Computer [Board=" + mBoard + ", CPU=" + mCpu + ", RAM=" + mRam + ", HardDisk="
                + mHardDisk + "]";
    }
}

public class HPComputer extends Computer {
    @Override
    public String toString() {
        return "HP Computer [Board=" + mBoard + ", CPU=" + mCpu + ", RAM=" + mRam + ", HardDisk="
                + mHardDisk + "]";
    }
}

这样我们便完成了建造者模式的实现,可以通过下面的代码进行测试:

public class Client {
    public static void main(String[] args) {
        Builder asusBuilder = new AsusBuilder();
        Builder dellBuilder = new DellBuilder();

        Director director = new Director(asusBuilder);
        director.buildComputer("Asus Board", "Intel i7-8700K", "16GB DDR4", "1TB SSD");
        Computer asusComputer = asusBuilder.createComputer();
        System.out.println(asusComputer.toString());

        director = new Director(dellBuilder);
        director.buildComputer("Dell Board", "Intel Xeon E-2224G", "32GB DDR4", "2x 512Gb NVMe SSD");
        Computer dellComputer = dellBuilder.createComputer();
        System.out.println(dellComputer.toString());
    }
}

输出结果如下:

Asus Computer [Board=Asus Board, CPU=Intel i7-8700K, RAM=16GB DDR4, HardDisk=1TB SSD]
Dell Computer [Board=Dell Board, CPU=Intel Xeon E-2224G, RAM=32GB DDR4, HardDisk=2x 512Gb NVMe SSD]

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

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

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

相关文章

C++ STL 之 list 的模拟实现

文章目录 📍前言🌈STL之list的模拟实现🎈list_node节点的定义🎈iterator迭代器🕯️构造函数🕯️*it🕯️->🕯️it/it🕯️it--/--it🕯️! / 🎈l…

[MAUI程序设计]界面多态与实现

文章目录 需求一:在不同设备上使用不同 UI 外观定义控件 UI 外观基于平台自定义配置 需求二:在不同数据类别中使用不同的 UI 外观定义视图 UI 外观创建数据模板创建选择器定义数据 需求三:在不同数据状态中使用不同的 UI 外观使用绑定模型更改…

【腾讯云FinOps Crane 集训营】Crane 助力云原生用户充分发挥云上资源的最大价值,帮助企业降本增效之利器

文章目录 Crane 助力云原生用户充分发挥云上资源的最大价值,帮助企业降本增效之利器前言云上资源成本虚高的现状一、云原生的崛起:服务上云二、服务上云的魔咒:服务健壮了,钱袋子却空了三、钱都去哪了:云资源无序投入的…

golang 微服务的负载均衡

上次我们说了一下 微服务的容错处理,是用的 断路器 这一次我们来一起看看 微服务的负载均衡是如何做的 负载均衡 负载均衡是什么呢? 他能够将大量的请求,根据负载均衡算法,将不同的请求分发到多台服务器上进行处理&#xff0c…

Git Mac设置系统命令别名和Git命令别名

有时候git命令的别名过长要如何,在命令行不方便输入,这时候我们可以设置命令别名。 设置系统命令别名 设置系统命令别名可以在.bash_profile文件中配置,这个文件也是我们经常配置环境变量的地方,这个文件本身是不可见的&#xf…

rtp h264 发送和接收程序的问题

目的 为了自己写一个投屏协议,目前重新启用rtp协议,使用rtp协议直传效率最高,并且使用的是udp ffmpeg 发送rtp ffmpeg的rtp发送时一般把sps和pps放在一个包里面,写接收代码的时候要注意,在单包里面可以直接接收到两…

第一章: Mybatis-Plus 之了解

目录 1.1:Mybatis-Plus介绍 1.2:代码及文档地址 1.3:特性 1.4:架构 1.5:作者 下面的图文来自于官方的介绍 1.1:Mybatis-Plus介绍 Mybatis-Plus 是一个 Mybatis 的增强工具,在Mybatis的基…

Seata之 Win系统和 Linux系统搭建

文章目录 1 Seata搭建1.1 Linux环境搭建1.1.1 准备工作1.1.2 下载1.1.3 建表1.1.4 配置 nacos1.1.4.1 新建命名空间1.1.4.2 上传配置至Nacos配置中心1.1.4.3 不上传而使用配置 1.1.5 修改 appplication.yml1.1.5.1 seata.store1.1.5.2 seata.config1.1.5.3 seata.registry 1.1.…

多模态:InstructBLIP

多模态:InstructBLIP IntroductionMethoddatasetInstruction-aware 视觉提取架构Dataset Balance 实验参考 Introduction 作者表示,与nlp任务不同,多模态任务由于引入额外的视觉输入,它的任务更加多样化,这似的联合多…

Immich让你从此告别百度网盘备份手机照片

一. Immich 是什么 Immich是一个开源的图片自托管服务,它能实现类似于百度网盘的照片自动备份、分类等功能,它同时提供了Web管理页面,和移动端APP,可以轻松备份手机中的照片至家庭服务器中。这一应用也在很多群辉玩家中用于替代“…

在 Windows 上安装 Helm包

一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡,让我们一起学习在 Windows 上安装 Helm包。如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连) 二、 Helm是什么 Helm是Kubernetes的包管理工具,类似于centos的yum,能够快速查找、下载和安装…

(2022 EMNLP)结合面部表情的情感分析

论文题目(Title):Face-Sensitive Image-to-Emotional-Text Cross-modal Translation for Multimodal Aspect-based Sentiment Analysis 研究问题(Question):面向面部敏感的图像-情感-文本翻译的跨模态的多…

【开源项目】TinyId 全网最好的分布式ID生成系统的源码解析

TINYID介绍 项目地址:https://github.com/didi/tinyid Tinyid是滴滴开发的一款分布式ID系统,Tinyid是在美团(Leaf)的leaf-segment算法基础上升级而来,不仅支持了数据库多主节点模式,还提供了tinyid-client客…

23种设计模式之适配器模式(Adapter Pattern)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的适配器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

[GYCTF2020]EasyThinking

功能:登录,注册,搜索 回显登录用户名,搜索历史 简单测试搜索历史发现可能不存在sql注入 www.zip下载源码 访问一个不存在的路径,爆出 thinkphp的框架,版本是6.0.0 参考:ThinkPHP 6.0.1 漏洞…

MyBatis操作数据库实现增删改查

创建数据库 语句要分别执行 CREATE DATABASE mybatis;USE mybatis;CREATE TABLE user(id INT(10) NOT NULL PRIMARY KEY,name VARCHAR(20) DEFAULT NULL,INSERT INTO user(id,name,pwd) VALUES (1,张三,123456), (2,李四,121212), (3,王五,1314520) 搭配环境 1、在pojo包创…

25.基于混合整数规划方法的微网电池储能容量优化配置

关键词:储能容量优化 储能配置 微网 编程语言:matlab 主题:基于混合整数规划方法的微网电池储能容量优化配置 主要内容: 本代码目的为实现微电网内电池容量的优化配置,目标函数为配置过程中整体的运行成本最小或…

【Spring】Spring AOP面向切面编程

文章目录 什么是Spring AOP?为什么要使用AOP?AOP相关组成的概念切面切点通知连接点 Spring AOP实现创建切面创建切点创建通知创建连接点示例演示 Spring AOP的实现原理 什么是Spring AOP? 想要知道Spring AOP,就得先了解AOP AOP是…

【周期信号】工程测试-数据处理-信号分析课程试题:周期信号与周期信号相加,所得信号一定是周期信号吗?

一、问题分析 某课程的作业题中,有下面的一种题目,判断两个周期信号相加,是否是周期信号,以及计算周期长短是多少。 非常显然,1、3、4题都很容易判断。 第2题,我们重点分析。 二、网上的错误论述 在百…

Vivado运用 Language Template 来创建set_input_delay/set_output...

时序约束中的 set_input_delay/set_output_delay 约束一直是一个难点,无论是概念、约束值的计算,还是最终的路径分析,每一次都要费一番脑子。Vivado为方便用户创建输入输出接口的约束,整理出了一套非常实用的InputDelay/Output De…