三、建造者模式——麦当劳的配餐服务

建造者模式——KFC点餐系统 建造者模式 题目 建造者模式可以用于描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。UML类图如下,编码实现以上功能。 类图 【分析】 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象; 建造者模式包含四种角色:复杂产品类Meal、抽象建造者类MealBuilder、若干具体建造者类和指挥者类; 若 阅读详情


设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

创建型 包含了 单例模式、工厂模式、建造者模式、原型模式。

1. 建造者模式

假设:
设计一个配置类Config,这个类包含十多个属性。
在构造这个类的时候通过构造函数,会出现组合爆炸的情况。

  • 方法1,设计一个大而全的构造函数,在调用构造函数时,对不需要的属性设置为Null,那么就需要在构造函数里对Null的属性进行判断和处理。
  • 方法2,通过默认构造函数创建一个对象后,再通过set方法去赋值。但set赋值需要多次调用,且set的顺序以及判定逻辑就交给了对象的使用者,不太友好。
  • 方法1和方法2还有一个问题。如果这些属性之间有关联, 需要同时设置,比如连接池常见的参数最大连接数、最小连接数、最大空闲连接数,一般需要同时设置。那么set时还容易漏掉,容易出错且不方便。

那么就考虑使用建造者模式吧。

public class Config {

	private int max_conn;
	private int min_conn;
	private int max_idle;
	private int max_timeout;
	private int max_retries;
	
	public Config(Builder builder) {
		max_conn = builder.max_conn;
		min_conn = builder.min_conn;
		max_idle = builder.max_idle ;
		max_timeout= builder.max_timeout;
		max_retries= builder.max_retries;
	}

	@Override
	public String toString() {
		return "Config{" +
				"max_conn=" + max_conn +
				", min_conn=" + min_conn +
				", max_idle=" + max_idle +
				", max_timeout=" + max_timeout +
				", max_retries=" + max_retries +
				'}';
	}

	public static class Builder{
	
		private int max_conn;
		private int min_conn;
		private int max_idle;
		private int max_timeout;
		private int max_retries;	
		
		public Config build() {
			if(max_conn<min_conn) throw new IllegalArgumentException("参数错误");
			return new Config(this);
		}
		
		public Builder setConn(int max_conn,int min_conn,int max_idle){
			this.max_conn = max_conn;
			this.min_conn = min_conn;
			this.max_idle = max_idle;
			return this;
		}
		
		public Builder setTimeOut(int max_timeout,int max_retries) {
			this.max_timeout= max_timeout;
			this.max_retries= max_retries;
			return this;
		}
	}
}

那么使用的时候很简单,可以使用链式调用。

public class Main {
    public static void main(String[] args) {
        Config cfg = new Config.Builder().setConn(10,2,1).setTimeOut(60,3).build();
        System.out.println(cfg);
    }
}

运行结果显示

Config{max_conn=10, min_conn=2, max_idle=1, max_timeout=60, max_retries=3}

总结

建造者模式就像一位厨师,在你点餐的时候会给你搭配薯条和番茄酱,给你炸鸡和啤酒,然后不断的放在你的餐盘上,最后送到你面前。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

软件设计模式--建造者模式---KFC套餐 实例:KFC套餐 建造者模式可以用于描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。 客户端类client: public class Client { public static void main(String args[]) { //动态确定套餐种类 MealBuild... 阅读详情

相关推荐

[创建型模式]设计模式之建造者模式(Builder Pattern)

NULL 博文链接:https://jacky-dai.iteye.com/blog/2295399

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

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

qq_36756227的博客 2322

ERA5获取的风场数据转换为.dfs2文件

ERA5获取风场数据的具体步骤可以参考下面的文章下载好后应该是.nc格式的文件,想要读取或者转换成其他格式的文件可以安装下面步骤,本文介绍如何转换为.dfs2文件。

我的博客 1459

7,建造者模式-麦当劳套餐

一,前言开始我们按照由易到难顺序进入,现在需要按照设计模式的分类进行了 创建型模式包含:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式 前篇完成了工厂模式专题了,包括简单工程,工厂方法模式,抽象工厂模式 下面两篇我们开始建造者模式和原型模式,这样就完成了创建型模式这一类的学习 二,建造者模式建造者模式:将一个复杂的对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示我们以一个麦

BraveWangDev 2423

LVGL高效加载外部Flash图片资源的实现与优化

本文深入探讨了在嵌入式UI开发中,如何为LVGL高效加载外部Flash中的图片资源。针对内部Flash容量不足的痛点,详细解析了LVGL的图片处理原理,并对比了内存映射与流式解码两种主流实现方案。文章重点提供了性能优化技巧与实战避坑指南,旨在帮助开发者实现流畅的图片加载体验,解决SPI Flash读取慢、内存占用高等核心挑战。

t1u2v的博客 462

CAPL编程的催化剂——CAPLdll的实现

CANoe作为一款功能强大的总线开发及测试工具,不仅仅是因为其丰富的库函数,最重要的是其兼容了多种编程语言,可以实现灵活的开发,极大的解决了纯CAPL编程所带来的限制,如通过动态链接库(DLL)来实现复杂函数的编写,使其能够在CAPL中可以调用,下面将对DLL的实现进行分析。capldll.cpp这个文件初看相当复杂,从整体上来说,这段代码主要包含了两部分:自定义函数实现和回调函数定义,今天的主要任务是实现自定义函数,这里的函数定义与普通函数定义差不多,只是利用了CAPL的格式。在VS2017工程中打开。

车载控制器AutoSAR软件开发工程师 4646

Java 设计模式——建造者模式(创建型设计模式)

一、简介 1、定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 2、主要作用:在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。 3、如何使用:用户只需要给出指定复杂对象的类型和内容,建造者模式负责按顺序创建复杂对象(把内部的建造过程和细节隐藏起来) 4、解决的问题: (1)、方便用户创建复杂的对象(不需要知道实现过程) (2)、代码复用性 & 封装性(将对象构建过程和细节进行封装 & 复用) 5、注意事项:与工厂模式的区别是:建造者模式更加关

泯灭于众生,高歌于孤夜! 1021

基于树莓派4B与NCNN的YOLOv8高效部署实战:无GPU环境下的C++加速优化全流程指南**

本文详细介绍了在树莓派4B上基于NCNN框架部署YOLOv8目标检测模型的全流程。内容包括:从PyTorch模型导出NCNN格式文件、树莓派环境配置(OpenCV和NCNN编译)、C++实现代码解析(含模型加载、推理及后处理),以及实际部署测试结果。在树莓派4B上达到约2FPS,并提供INT8量化、多线程等优化建议。该方案为无GPU设备提供了轻量化目标检测的实用部署方案,适合边缘计算场景。

FJN110的博客 916

建造者模式:一个打工人的一天

建造者模式定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。抽象建造者(Builder)为创建一个产品对象的各个部件定义抽象接口,一般会有两类方法一类是buildPartXXX(),由于创建各个部件,一类是方法是getResult(),返回复杂产品对象。抽象建造者可以是抽象类,也可以是接口。比如故事中的AbstractSubMealABuilder。具体建造者(ConcreteBuilder)实现抽象建造者定义的接口,即实现各个部件的具体创建。...

zherop的博客 235

[Dify实战] 招聘筛简历机器人:自动筛选、排序、生成面试要点-带绑定资源

摘要:本文介绍了如何利用Dify优化简历筛选流程,解决人工筛选耗时、标准不统一等问题。通过结构化输出"评分+亮点+风险+面试关注点",将主观判断转化为规则化流程。关键步骤包括:设计标准化Prompt、配置权重排序策略、确保公平合规性、与ATS系统对接,以及持续优化评估指标。该方法能显著提升筛选效率(缩短招聘周期)、增强一致性(避免主观偏差),并为面试官提供结构化参考信息,最终实现更高效精准的人才筛选。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 581

【Unity】 预制体Prefab使用说明

在 Unity 中,Prefab 是一个可以预先制作并重复使用的 GameObject 或组件集合,Prefab 中的 GameObject 可以有子对象和其他组件。

灵境引路人 2849

『设计模式』麦当劳的秘密建造者模式

将一个复杂对象的构件与它的表示分离,是的同样的构建可以创建不同的表示。 对象性质的建造 有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。 有些情况下,一个对象的一些性质必须按照某个顺序复制才有意义。在某个性质没有赋值之前,另一个性质则无法赋值。这些情况是的性质本身的建造涉及到复杂的商业逻辑。 这时候,此对象相当于一个有待建造的产品,而对象的这些性质相当于产品的零件,建造产品的过程就是组合零件的过程。由于组合零件的过程很复杂,因此,这些“零件”的组合过程往往被

日拱一卒,功不唐捐 3175

3.1 快速启动Flink集群

在本实战中,我们将快速启动Apache Flink 1.13.0集群,并在Hadoop集群环境中提交作业。首先,我们会在本地下载Flink安装包并上传至云主机,解压并配置环境变量。接着,我们将启动Flink集群,通过访问Web UI进行监控管理。然后,我们会配置集群,将Flink分发到从节点,并在集群上提交作业。最后,我们将通过命令行提交作业,并在Web UI上查看任务节点的输出结果。这个过程涵盖了Flink集群的部署、配置和作业提交,为大数据处理提供了一个完整的实战经验。

howard2005的专栏 727

Claude MCP协议切换器:构建AI工具调用的智能路由网关

在AI应用开发中,模型上下文协议(MCP)作为标准化接口,使大语言模型能够安全、可控地调用外部工具与数据源。其核心原理是通过定义统一的通信规范,将模型能力与异构服务解耦,从而提升AI系统的扩展性与模块化水平。这一技术为构建复杂AI助手提供了工程基础,尤其在需要集成多数据源、多工具链的场景下价值显著。基于此,MCP切换器应运而生,它作为智能代理层,实现了对多个后端MCP服务器的动态路由、统一管理与负载均衡。本文以Claude模型为例,深入解析如何通过配置化路由策略、健康检查与故障转移机制,搭建高可用的MCP代

weixin_30675247的博客 559

【WRF工具】WRF Domain Wizard第一期:软件下载及安装

【WRF工具介绍】WRF Domain Wizard-确定模拟区域

WW、forever的博客 2917

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

点餐系统(设计模式)

同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信息模拟肯德基快餐店的收银系统,结合设计模式(2种以上)至少实现系统的以下功能: 正常餐品结算和找零。 基本套餐结算和找零。 使用优惠劵购买餐品结算和找零。 可在一定时间段参与店内活动(自行设计或参考官网信息)。 模拟打印小票的功能(写到文件中)。 ...

baidu_38634843的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

建造者模式

建造者模式 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。 介绍 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 主要解决:主要解决在软件系统中,有...

cxu123321的博客 365

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Builder建造者模式的使用条件

为什么要使用建造者模式创建对象。 1.创建对象需要的属性过多比如十个八个或者二十个等,不宜使用构造函数传递参数。构造函数传递过多的参数可读性不好。同时,又不能暴露set方法去设置属性的值,创建好对象之后就不做修改了。这样就需要用到建造者模式,增加代码的可读性。 2.创建对象的时候,需要满足某些属性的值才可以创建成功。属性参数有依赖关系,比如需要判断某个值大于或者小于某个值的时候。或者某些值不能同时为空的时候等等。或者需要满足某些条件才可以。这样的就可以使用建造者模式去创建对象。 ...

qq_40207976的博客 398

Android设计模式-建造者模式-创建型-(1)

Android设计模式-建造者-创建-10. 什么是建造者模式?1. 优缺点2. 哪些库或方法使用观察者模式来实现的?3. 举例说明-计算其中的 + - * /4. Context类的探究5. Android技术生活交流 Android设计模式Github项目地址: 点击跳转 0. 什么是建造者模式? 1、将一个复杂的对象分离,使用多个简单的对象一步步的建造构成一个复杂的对象。 1. 优缺点 优点: 1、将复杂的创建过程封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如

ruiruiddd的博客 234

点餐系统架构模型_(完整版)点菜系统数据库设计

11引言.....................................................................21.1编写目的...............................................................21.2定义.....................................................

weixin_39822493的博客 3045

建造者模式之儿童餐

建造者模式之儿童餐 1、 实例概况 建造者模式可以用于快餐店制作儿童餐。 典型的儿童餐包括一个主食、一个辅食一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。 无论顾客点的是汉堡、三明治还是鸡肉,过程都是一样的。 柜台的员工直接把主食、辅食和玩具放在一起。 这些是放在一个袋子中的。 饮料被倒入杯中,放在袋子外边。 这些过程在相互竞争的餐馆中是同样的。 2、实例类图 3、实例实现代码 3.1产品类ZC32Meal(套餐类)

超小超的博客 860

设计模式-【建造者模式】

【建造者模式应用场景举例】     比如在玩“极品飞车”这款游戏,那么每一关的地图会千变万化,简单的来说,地图会有晴天和阴天之分,那么创建地图时就要根据晴天或者阴天来对地图上的场景,比如:天空,树,房子,和路面进行渲染,这个过程是一个固定的,每创建一个新地图都要执行这几个渲染,这是针对高级配置的电脑来说的。     现在拥有低配置电脑的人不在少数,那么他们就不能玩游戏了吗?完全可以!只要将地图

Carson IT之旅 962

建造者模式(Builder Pattern)

建造者模式(Builder Pattern) 建造者模式(Builder Pattern)(转) ——.NET设计模式系列之四 Terrylee,2005年12月17日 概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一...

aiwend9976的博客 335

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 215

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 326

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 147
上一篇: 二、工厂模式——在工厂里能找到你的对象
下一篇: 四、原型模式——别自己造了,复制吧
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值