建造者模式详解:建造随意搭配的肯德基套餐

news2024/9/21 22:47:57

一、简介

建造者模式(Builder Pattern)是五种创建型设计模式之一,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。这句话怎么理解呢:一个对象的构建过程本质上就是这个对象包含的所有成员属性的构建过程,如果对象的属性非常多,属性本身组成复杂,甚至属性之间存在关联,那么该类的构建过程就显得很麻烦,如果所有代码都定义在本类中,代码会显得很臃肿甚至条理不清,所以我们可以将类的属性构建过程独立剥离出来,用单独的一个类去承载,这个类就是建造者类

建造者模式一般包含以下角色:

  • 产品角色:要创建的复杂对象,一般包含多个组成部分,一般提供静态builder()方法来生成建造者。
  • 建造者类: 用于构造复杂对象,灵活创建对象的各个组成部分,一般包含build()方法用于返回最终对象。可以提炼抽象层。
  • 指挥者 :非必须角色,调用建造者的方法控制复杂对象构建,主要用于封装构建过程,进行代码复用。

优点

  • 向客户端隐藏了复杂对象的构建细节。
  • 将产品本身和产品的创建过程进行解耦,可以更加精细地控制产品的创建过程,使得相同的创建过程可以创建不同的产品对象。
  • 通过引入指挥者,可以实现构建过程的复用。
  • 建造者独立,易于扩展,同时提高代码的可读性和可维护性。

缺点

  • 建造者模式增加了类的数量,所以增加了系统的复杂性。
  • 产品的组成发生变化时,建造者类需要同步修改。

适用场景

  • 需要生成的对象具有复杂的内部结构,有很多属性。
  • 需要生成的对象内部属性之间存在一定的依赖关系或约束条件。
  • 需要分离对象和对象的创建过程。

二、实现案例

构建一份肯德基套餐

假设我们需要构建一份肯德基套餐,一份套餐至少包含n份汉堡,n份小食,n份饮料。那么这样一份套餐的组合方式就有很多种了,如单人套餐,双人套餐,全家桶,任意搭配等。接下来我们使用建造者模式来创建这样的一份套餐。

代码实现

参考源码类实现

org.apache.flink.connector.kafka.source.KafkaSourceBuilder
org.apache.flink.connector.jdbc.JdbcExecutionOptions.Builder

产品类

产品就是一份肯德基套餐,包含汉堡,小食,饮料,且数量不限。

public class Product {
    private List<String> burgers;//汉堡
    private List<String> snacks;//小食
    private List<String> drinks;//饮料

    public Product(List<String> burgers, List<String> snacks, List<String> drinks) {
        this.burgers = burgers;
        this.snacks = snacks;
        this.drinks = drinks;
    }
	
    //创建一个建造者类
    public static ProductBuilder builder(){
        return new ProductBuilder();
    }
	
    //展示套餐中的内容
    public void showProduct() {
        int i=burgers.size();
        int j=snacks.size();
        int k=drinks.size();
        String res="已经创建了一份套餐,该套餐包含:"+"\n"
                +i+"个汉堡,"+burgers.toString()+"\n"
                +j+"份小食,"+snacks.toString()+"\n"
                +k+"瓶饮料,"+drinks.toString();
        System.out.println(res);
    }
}

建造者类

建造者主要包含往套餐中加料的方法,如往套餐中加入一份具体的汉堡addBurger,一瓶具体的饮料addDrink等,最后提供一个build()方法,返回创建好的套餐

public class ProductBuilder {
    private List<String> burgers;
    private List<String> snacks;
    private List<String> drinks;

    public ProductBuilder() {
        this.burgers = new ArrayList<>();
        this.snacks = new ArrayList<>();
        this.drinks = new ArrayList<>();
    }

    public ProductBuilder addBurger(String burger){
        burgers.add(burger);
        return this;
    }

    public ProductBuilder addSnack(String snack){
        snacks.add(snack);
        return this;
    }

    public ProductBuilder addDrink(String drink){
        drinks.add(drink);
        return this;
    }

    public Product build(){
        return new Product(burgers,snacks,drinks);
    }
}

测试类

创建一份任意搭配的套餐。

public class Test {
    public static void main(String[] args) {
        Product product=Product.builder()
                .addBurger("奥尔良汉堡")
                .addBurger("巧克力汉堡")
                .addSnack("薯条")
                .addDrink("中杯可乐")
                .build();
        product.showProduct();
    }
}

image-20230508170808438

指挥者(可选)

如果考虑代码复用性,还可以创建一个指挥者类,用于构建单人套餐,双人套餐等。

public class Director {
    //创建单人套餐
    public static Product createSingleProducts(){
        return Product.builder()
                .addBurger("奥尔良汉堡")
                .addSnack("薯条")
                .addDrink("中杯可乐")
                .build();
    }
    //创建双人套餐
    public static Product createDoubleProducts(){
        return Product.builder()
                .addBurger("奥尔良汉堡").addBurger("巧克力汉堡")
                .addSnack("薯条").addSnack("蛋黄派")
                .addDrink("中杯可乐").addDrink("热牛奶")
                .build();
    }
}

使用指挥者直接创建定制套餐

public class Test {
    public static void main(String[] args) {
        //创建双人套餐
        Product product=Director.createDoubleProducts();
        product.showProduct();
    }
}

三、总结

本文详细介绍了Java建造者模式,通过模拟构建肯德基套餐的案例,让你轻松掌握建造者模式的原理和实现。Java建造者模式使用多个简单的对象一步一步构建成一个复杂的对象,可以精细控制对象的每一个属性创建。这种模式建造者独立于产品对象,专职于产品的创建工作,能显著提高代码的可读性和可维护性。

总之,建造者模式是Java程序员必备的技能之一,掌握它将为你在软件开发领域提供更多的机会。希望本文能对你有所帮助,如果你喜欢这篇文章,别忘了点赞和关注哦!


在这里插入图片描述

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

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

相关文章

一觉醒来IDEA感觉不香了,AI智能编程工具Cursor使用

一、简介 为使用人工智能编程而构建的编辑器&#xff0c;一款人工智能编程软件、智能Ai代码生成工具。 它有什么特点呢&#xff1f; 集成了GPT-4&#xff0c;国内可用&#xff0c;不仅有ChatGPT的聊天功能&#xff0c;还有强大的自动代码生成能力&#xff0c;简直是编码神器。 …

Java中常见的几种数组排序方法

这篇文章总结一下我学习到的几种常见的数组排序方法 冒泡排序 冒泡排序在我看来是最简单、最基本的排序方法&#xff0c;我们应当将冒泡排序的原理和代码熟记于心。 冒泡排序的原理十分简单&#xff1a;用数组的第一个元素和第二个元素进行比较&#xff0c;将大的放到后面&a…

【Java编程系列】Minio实现文件上传下载

热门系列&#xff1a; 【Java编程系列】Amazon S3实现文件上传下载 目录 热门系列&#xff1a; 1、前言 2、Minio实战代码 2.1 Minio环境部署 2.2 Minio的Sdk对接实现 2.2.1 Minio Maven依赖 2.2.2 minio配置与初始化 2.2.3 上传文件 2.2.4 下载文件 2.2.5 生成文件…

【LLM大模型】LLM模型和指令微调方法

note 文章目录 note零、AIGC生成式模型1. 核心要素2. LLM evolutionary tree3. 几个bigScience里的概念 二、LLM大模型1. ChatGLM&#xff08;1&#xff09;GLM-130B&#xff08;2&#xff09;ChatGLM-6B 2. LLaMA3. RoBERTa4. Bloom5. PaLM 三、模型指令微调1. 指令微调的注意…

使用Vue+Vue-router+el-menu实现菜单功能实战

前言 上节回顾 上一小节我们使用H5+CSS3实现了管理平台的架构布局,并且通过Vuex的使用,获取到前端数据本地化存储的username,绑定到右上角进行全局展示。还不了解上下文的同学可以回顾一下 使用Vue+Vuex+CSS3完成管理端响应式架构模板实战 。 本节介绍 本小节已经是专栏的…

【C语言】字符串---刷题篇

1.统计字符串中元音字母的字数 2.使用起泡法和选择法将字符串按ASCII码值从小到大排列 3.将字符串中的数字字符倒置&#xff0c;即‘0’变‘9’、‘1’变‘8’、…、‘9’变‘0’.例如&#xff1a;字符串“a1b2c3d4e9f0”倒置变为“a8b7c6d5e0f9 4.将一个字符串中从第m个字符开…

187页9万字企业大数据治理与云平台实施方案(word)

1 项目背景概述 1.1 项目背景理解 1.2 项目需求范围 2 项目技术方案 2.1 咨询研究服务方案 2.1.1 咨询研究服务内容 2.1.2 咨询服务方案 2.2 第三方独立评估 2.2.1 概述 2.2.2 管理办法 2.2.3 考核机制 2.3 安全咨询研究服务方案 2.3.1 安全咨询服务内…

大唐杯学习笔记(1)—— 5G网络架构与组网部署

目录 一、名词汇总1.核心网与接入网2.5G网络架构3.核心网架构演进(1)2G核心网(1)3G&#xff0c;4G核心网 4.4G核心网架构5.5G核心网架构6.5G接入网网架构7.主要网元功能 二、5G主要网元功能1.用户面功能UPF(User Plane Function)2.会话管理功能SMF(Session Management Function…

【SpringCloud微服务实践】服务注册与发现(理论)

注册与发现 在之前的示例中&#xff0c;采取的是硬编码的方式&#xff0c;需要调用的微服务的地址是被我们写死在文件或代码中的。在传统应用程序中&#xff0c;一般都是这么做的&#xff0c;然而这种方式存在不少缺陷&#xff1a; 静态配置&#xff1a;因为是写死的网络地址…

Cy5.5-PEG2000-Biotin,Cy5.5-聚乙二醇-生物素;Biotin-PEG-Cy5.5;可用于检测抗生物素、链霉亲和素或中性生物素

Cyanine5.5-PEG-Biotin&#xff0c;Cy5.5-聚乙二醇-生物素 中文名称;Cy5.5-聚乙二醇-生物素 英文名称;Cyanine5.5-PEG-Biotin 性状&#xff1a;粘稠液体或固体粉末&#xff0c;取决于分子量大小 溶剂&#xff1a;溶于水、氯仿、DMSO等常规性有机溶剂 分子量PEG:1k、2k、3.…

【Python】JupyterLab报错:Server Connection Error如何解决?

文章目录 一、报错情形二、深层原因三、解决方案3.1 重命名用户名3.2 启用Administrator账户3.3 切换Administrator账户3.4 重命名用户文件夹3.5 修改注册表3.6 修改环境变量 小结 Anaconda的JupyterLab 作为优秀的网页编辑器&#xff0c;非常适用于编写Python程序&#xff0c;…

Qt的窗口的设置

窗口外部设置 Qt::WindowFlags Qt::WidgetQWidget默认窗口&#xff0c;没有父窗口的话&#xff0c;是一个独立窗口Qt::Window是一个窗口&#xff0c;有窗口边框和标题Qt::Dialog是一个对话框窗口Qt::Sheet是一个窗口或部件Macintosh表单(sheet)Qt::Drawer是一个窗口或部件Ma…

Mac 安装Nginx详细教程

一、前言 本文介绍一下&#xff0c;如何在Mac系统中安装Nginx&#xff0c;把详细过程记录下来&#xff0c;方便以后查看&#xff0c;也方便大家学习。 二、正文 1、安装 Homebrew homebrew是什么&#xff1f;它是Mac中的一款软件包管理工具&#xff0c;通过brew可以很方便的…

复刻一个羊了个羊掘金商城版

游戏逻辑 与羊了个羊逻辑一致&#xff0c;不再赘述 游戏实现 盛放元素的容器box&#xff0c;临时存储的容器temp&#xff0c;多余元素的容器source与source1&#xff0c;结果元素result <div id"box"></div><div id"temp"></div&…

【OC底层-类和对象深基】

文章目录 前言1 类和对象1.1 类1.1.1 cache_t 和 class_data_bits_t 1.2 对象 2 isa指针&#xff08;结构体&#xff09;复习-OC中的对象实例对象&#xff08;Instance&#xff09;类对象(Class)元类对象isa的指向方法调用顺序&#xff08;不涉及消息转发&#xff09; 2.1 unio…

JavaScrip 实战案例之【实现动画导航栏效果】

​Hello~ 咱们今天一起来学习一个动画导航的小项目 Part 1 HTML结构 <body><nav class"active" id"nav"><ul><li><a href"#">Home</a></li><li><a href"#">Works</a>&…

Cy5.5-PEG-NH2/SH/COOH/MAL,NH2-PEG-Cy5.5;CY5.5-聚乙二醇-氨基文章介绍

Cy5.5-PEG-NH2 cy5.5-聚乙二醇-氨基 中文名称&#xff1a;CY5.5-聚乙二醇-氨基 英文名称&#xff1a;Cy5.5-PEG-NH2 溶剂&#xff1a;溶于水、氯仿&#xff0c;DMSO等常规性有机溶剂 性状&#xff1a;固体或粉末&#xff0c;取决于分子量 分子量&#xff1a;1k、2k、3.4k、…

计算机视觉(4)—— 未有深度学习之前

目录 四、未有深度学习之前 4.1 图像分割 4.1.1 基于阈值分割 4.1.2 基于边缘分割 4.1.3 基于区域分割 &#xff08;1&#xff09;区域生长法 &#xff08;2&#xff09;分水岭算法 4.1.4 基于图论分割 &#xff08;1&#xff09;Graph Cuts 分割 ​&#xff08;2&…

关于说服(三)- 表达

关于口才 一般人眼中的口才好&#xff1a; 有见解&#xff0c;有想法内容条理分明&#xff0c;逻辑清晰严谨真诚自信&#xff0c;拉近距离 这些都关注于逻辑与内容&#xff0c;真正的表达是要教你如何输出有价值的信息 表达需要做什么&#xff1a; 如何筛选素材&#xff0c…

【P16】JMeter JSON提取器(JSON Extractor)

文章目录 一、准备工作二、测试计划设计 一、准备工作 慕慕生鲜&#xff1a; http://111.231.103.117/#/login 进入网页后&#xff0c;登录&#xff0c;页面提供了账户和密码 搜索框输入“虾” 右键检查或按F12&#xff0c;打开调试工具&#xff0c;点击搜索 二、测试计划设…