23种设计模式【创建型模式】详细介绍之【建造者模式】

建造者模式:构建复杂对象的精妙设计

  • 设计模式的分类和应用场景总结
  • 建造者模式:构建复杂对象的精妙设计
    • 建造者模式的核心思想
    • 建造者模式的参与者
    • Java示例:建造者模式

设计模式的分类和应用场景总结

可以查看专栏设计模式:设计模式

建造者模式:构建复杂对象的精妙设计

建造者模式是一种创建型设计模式,用于构建复杂对象。它将对象的构建过程与其表示分离,允许您以可控和可扩展的方式构建对象。在本文中,我们将深入探讨建造者模式,解释其核心概念,并提供Java示例代码来演示如何使用建造者模式。

建造者模式的核心思想

建造者模式的核心思想是将一个复杂对象的构建过程分为多个步骤,每个步骤由一个独立的"建造者"对象负责完成。最终,这些建造者协同工作,按顺序构建出一个完整的对象。

通过使用建造者模式,您可以在构建对象时灵活地添加、修改或删除步骤,而不会影响其他部分的代码。这种分离的方式有助于管理复杂对象的构建,提高可维护性和可读性。

建造者模式的参与者

建造者模式包含以下主要参与者:

  1. 产品(Product):要构建的复杂对象。产品通常包含多个属性和方法。

  2. 抽象建造者(Builder):定义了构建产品各个部分的接口。每个部分都有一个对应的建造方法。

  3. 具体建造者(Concrete Builder):实现了抽象建造者接口,负责构建产品的各个部分。每个具体建造者都可以构建出不同类型的产品。

  4. 指挥者(Director):负责调用具体建造者的方法,按照一定的顺序构建产品。指挥者知道如何构建一个完整的产品。

Java示例:建造者模式

让我们通过一个简单的Java示例来演示建造者模式。我们将构建一个Meal对象,包括主食、饮料和甜点。

// 产品类
class Meal {
    private String mainCourse;
    private String beverage;
    private String dessert;

    public void setMainCourse(String mainCourse) {
        this.mainCourse = mainCourse;
    }

    public void setBeverage(String beverage) {
        this.beverage = beverage;
    }

    public void setDessert(String dessert) {
        this.dessert = dessert;
    }

    public void describe() {
        System.out.println("Main Course: " + mainCourse);
        System.out.println("Beverage: " + beverage);
        System.out.println("Dessert: " + dessert);
    }
}

// 抽象建造者接口
interface MealBuilder {
    void buildMainCourse();
    void buildBeverage();
    void buildDessert();
    Meal getMeal();
}

// 具体建造者实现
class VegMealBuilder implements MealBuilder {
    private Meal meal = new Meal();

    @Override
    public void buildMainCourse() {
        meal.setMainCourse("Vegetarian Burger");
    }

    @Override
    public void buildBeverage() {
        meal.setBeverage("Water");
    }

    @Override
    public void buildDessert() {
        meal.setDessert("Fruit Salad");
    }

    @Override
    public Meal getMeal() {
        return meal;
    }
}

class NonVegMealBuilder implements MealBuilder {
    private Meal meal = new Meal();

    @Override
    public void buildMainCourse() {
        meal.setMainCourse("Chicken Burger");
    }

    @Override
    public void buildBeverage() {
        meal.setBeverage("Coke");
    }

    @Override
    public void buildDessert() {
        meal.setDessert("Chocolate Cake");
    }

    @Override
    public Meal getMeal() {
        return meal;
    }
}

// 指挥者
class Waiter {
    private MealBuilder mealBuilder;

    public Waiter(MealBuilder mealBuilder) {
        this.mealBuilder = mealBuilder;
    }

    public Meal constructMeal() {
        mealBuilder.buildMainCourse();
        mealBuilder.buildBeverage();
        mealBuilder.buildDessert();
        return mealBuilder.getMeal();
    }
}

public class BuilderPatternExample {
    public static void main(String[] args) {
        MealBuilder vegMealBuilder = new VegMealBuilder();
        MealBuilder nonVegMealBuilder = new NonVegMealBuilder();

        Waiter waiter1 = new Waiter(vegMealBuilder);
        Meal vegMeal = waiter1.constructMeal();
        System.out.println("Veg Meal:");
        vegMeal.describe();

        Waiter waiter2 = new Waiter(nonVegMealBuilder);
        Meal nonVegMeal = waiter2.constructMeal();
        System.out.println("Non-Veg Meal:");
        nonVegMeal.describe();
    }
}

在这个示例中,我们创建了一个Meal类作为产品。然后,我们定义了抽象建造者接口MealBuilder,并创建了两个具体建造者VegMealBuilderNonVegMealBuilder,它们分别构建了不同类型的餐点。最后,我们有一个Waiter类作为指挥者,它知道如何构建不同类型的餐点。

通过建造者模式,我们能够以可控和可扩展的方式构建不同类型的餐点,而不会使构建过程变得混乱。这提供了更好的灵活性和可维护性,尤其在构建复杂对象时非常有用。

版权声明:
原创博主:牛哄哄的柯南
博主原文链接:https://keafmd.blog.csdn.net/
个人博客链接:https://www.keafmd.top/

看完如果对你有帮助,感谢点击下面的点赞支持!
[哈哈][抱拳]

在这里插入图片描述
加油!

共同努力!

Keafmd

感谢支持牛哄哄的柯南,期待你的三连+关注~~

keep accumulate for my dream【共勉】

                                                       ↓   ↓   ↓   ↓   ↓   ↓  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uni-app打包apk实现自动更新

一、直接复制粘贴就可用(豪横) app.vue文件里写 //app.vue里写 <script>export default {onShow: function() {console.log(App Show)},onHide: function() {console.log(App Hide)},onLaunch: function() {let appVersion uni.getSystemInfo({success: function(e) {ap…

WSL2Linux 子系统(六)

WSL 连接USB WSL (Windows Subsystem for Linux) 是一种在 Windows 操作系统上运行 Linux 应用程序的兼容层。它的主要作用是提供了一个类似于虚拟机的环境&#xff0c;使得在 Windows 上开发和运行基于 Linux 的应用变得更加方便。然而&#xff0c;WSL 目前还不支持直接通过 …

【设计模式】第4节:创建型模式之“单例模式”

一、介绍 采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 不使用单例模式的UML类图&#xff1a; 使用单例模式的UML类图&#xff1a; 使用场景&#xff1a; 需要频繁创建或销毁的对象…

C++项目——云备份-⑤-数据管理模块的设计与实现

文章目录 专栏导读1.要管理的数据有哪些2.如何管理数据3.数据信息结构体设计与实现4.数据管理类设计5.数据管理类实现6.数据管理模块整理 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师…

05 网络和防火墙等其他

网络和其他 ifconfig : 主机ip地址查询

【Linux】安装VMWare虚拟机(安装配置)和配置Windows Server 2012 R2(安装配置连接vm虚拟机)以及环境配置

前言&#xff1a; 一、操作系统简介 1、什么是操作系统 操作系统是一种软件&#xff0c;它管理计算机系统的硬件和软件资源&#xff0c;并提供给用户和应用程序接口&#xff0c;使它们能够与计算机系统交互和运行。操作系统负责调度和分配系统资源&#xff0c;例如处理器、内存…

【QT】Qt控件不显示图标

问题描述 本人在跟着B站视频学习QT时&#xff0c;遇到了一件十分悲惨的事情&#xff0c;一模一样的步骤&#xff0c;我的图标却不能显示。 于是我上网查询一下解决方案&#xff0c;第一种&#xff0c;亲测没用&#xff1b;第二种亲测可以。 解决方法一 1、构建 -> 清理项目…

java springboot2.7 写一个本地 pdf 预览的接口

依赖方面 创建的是 接口web项目就好了 然后包管理工具打开需要这些 import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; imp…

JavaScript进阶知识汇总~

JavaScript 进阶 给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 1.原型链入门 1) 构造函数 当我们自定义一个函数时(箭头函数与生成器函数除外)&#xff0c;这个函…

嵌入式系统设计师考试笔记之操作系统基础复习笔记二

目录 3、任务管理 &#xff08;1&#xff09;嵌入式操作系统的任务管理可以分为 &#xff08;2&#xff09;进程 &#xff08;3&#xff09;线程 &#xff08;4&#xff09;任务 &#xff08;5&#xff09;任务的创建与中止 &#xff08;6&#xff09;任务的状态任务有三…

APP分发-CDN加速原理

摘要 CDN的全称是(Content Delivery Network)&#xff0c;即内容分发网络。其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层&#xff0c;将网站的内容发布到最接近用户的网络”边缘“的节点&#xff0c;使用户可以就近取得所需的内容&#xff0c;提高用户访问网站的…

华为机试题:HJ4 字符串分隔

目录 第一章、算法题1.1&#xff09;题目描述1.2&#xff09;解题思路与答案1.3&#xff09;牛客链接 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、算法题 1.1&#xff09;题目描述 题目描述&…

Android APK瘦身实践:二次瘦身如何再减少大小?(4M—2.9M)

瘦身前 因为平时就考虑到大小的限制&#xff0c;所以很多工作已经做过了&#xff0c;如下列举现在的状态&#xff1a; 7.3M&#xff08;Debug版本&#xff09;和6.5M&#xff08;Release版本&#xff09; 开启minifyEnabled 开启shrinkResources 已经去除不相关的大型库 图片和…

基于 nodejs+vue旅游推荐系统 mysql

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

三步,金蝶K3的数据可视化了

数据可视化的一大特点就是“一图胜千言”&#xff0c;没什么能比图表更直观展现数据的了。那&#xff0c;金蝶K3系统上那海量数据能不能也做成数据可视化报表&#xff1f;操作复杂吗&#xff0c;难度大吗&#xff1f; 换了别的软件来做&#xff0c;操作多、难度大是板上钉钉&a…

华为数通方向HCIP-DataCom H12-831题库(多选题:81-100)

第81题 经典的网络转发方式是基于路由表转发。OpenFlow交换机的转发方式是基于流表转发。对于这两种转发方式,以下说法正确的有哪些选项? A、流表的匹配方式是同时匹配流量的MAC地址和IP地址。 B、路由表的匹配方式是匹配拥有最长掩码的目的网段路由 C、流表是变长的。一台网…

Openssl数据安全传输平台011:base64的使用

文章目录 1 base641.1 概念1.2 应用场景 2 base64 算法 &#xff08;重要&#xff09;3 openssl 中base64的使用3.1 BIO 操作3.2 base64 编码 -> bio链的写操作3.3 base64 解码 -> bio链的读操作 1 base64 1.1 概念 Base64是一种基于64个可打印字符来表示二进制数据的表…

一文5000字从0到1使用Jmeter实现轻量级的接口自动化测试(图文并茂)

接口测试虽然作为版本的一环&#xff0c;但是也是有一套完整的体系&#xff0c;有接口的功能测试、性能测试、安全测试&#xff1b;同时&#xff0c;由于接口的特性&#xff0c;接口的自动化低成本高收益的&#xff0c;使用一些开源工具或一些轻量级的方法&#xff0c;在测试用…

Win10中Pro/E鼠标滚轮不能缩放该怎么办?

Pro/E安装好后&#xff0c;鼠标滚轮不能缩放模型&#xff0c;该怎么办&#xff1f;问题多发生在win8/win10上&#xff0c;新装了PROE&#xff0c;发现滑动鼠标中键不能放大缩小。 彩虹图纸管理软件_图纸管理系统_图纸文档管理软件系统_彩虹EDM【官网】彩虹EDM图纸管理软件系统…

Android 11.0 禁用插入耳机时弹出的保护听力对话框

1.前言 在11.0的系统开发中,在某些产品中会对耳机音量调节过高限制,在调高到最大音量的70%的时候,会弹出音量过高弹出警告,所以产品 开发的需要要求去掉这个音量弹窗警告功能 2.禁用插入耳机时弹出的保护听力对话框的核心类 frameworks\base\packages\SystemUI\src\com\and…