当前位置: 首页 > news >正文

设计模式:创建者模式

定义

创建者模式(Builder Pattern),又称建造者模式,是一种创建型设计模式,它提供了一种创建对象的最佳方式。该模式允许将一个复杂对象的构建与它的表示分离,这样同样的构建过程可以创建不同的表示。创建者模式通常使用一个指挥者(Director)类,它指导构建过程,以及一个或多个建造者(Builder)类,它们用于实现具体的构建步骤。

应用场景

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

  • 当一个对象需要多个部分组合在一起,并且对象的组合需要满足一定的构造过程时。
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程允许被构造的对象有不同的表示时。

示例

假设我们需要创建一个复杂的Meal对象,它由DrinkMainCourseDessert组成。我们可以使用创建者模式来逐步构建这个Meal对象。

// 产品类
class Meal {private String drink;private String mainCourse;private String dessert;// getters and setters...
}// 抽象建造者
abstract class MealBuilder {protected Meal meal;public Meal getMeal() {return meal;}public void createNewMeal() {meal = new Meal();}public abstract void buildDrink();public abstract void buildMainCourse();public abstract void buildDessert();
}// 具体建造者
class ItalianMealBuilder extends MealBuilder {public void buildDrink() {meal.setDrink("Red Wine");}public void buildMainCourse() {meal.setMainCourse("Pizza");}public void buildDessert() {meal.setDessert("Gelato");}
}class JapaneseMealBuilder extends MealBuilder {public void buildDrink() {meal.setDrink("Sake");}public void buildMainCourse() {meal.setMainCourse("Sushi");}public void buildDessert() {meal.setDessert("Mochi");}
}// 指挥者
class Director {private MealBuilder mealBuilder;public Director(MealBuilder mealBuilder) {this.mealBuilder = mealBuilder;}public Meal construct() {mealBuilder.createNewMeal();mealBuilder.buildDrink();mealBuilder.buildMainCourse();mealBuilder.buildDessert();return mealBuilder.getMeal();}
}// 客户端代码
public class Client {public static void main(String[] args) {MealBuilder builder = new ItalianMealBuilder();Director director = new Director(builder);Meal meal = director.construct();// 使用meal对象...}
}

原则间的权衡与冲突

创建者模式遵循了几个软件设计原则:

  • 单一职责原则:通过将复杂对象的创建过程从其表示中分离出来,创建者模式使得同一个构建过程可以创建不同的表示。
  • 开闭原则:如果需要引入新的类型的对象,无需修改现有的指挥者和客户端代码,只需添加一个新的建造者类即可。

然而,如果对象的构建过程相对简单,或者不需要多样化的表示,使用创建者模式可能会导致不必要的复杂性。

设计模式的局限性

  • 复杂性:对于简单对象,使用创建者模式可能会导致设计变得过于复杂。
  • 性能开销:创建者模式中的多个步骤可能会导致性能开销,特别是在对象创建的热点路径中。

总结与建议

创建者模式非常适合构建复杂对象,尤其是当对象需要多个部分以特定顺序组合时。然而,如果对象的构造过程简单,或者不需要独立的表示,则应该避免使用创建者模式,以免增加不必要的复杂性。在决定是否使用创建者模式时,应该考虑当前和未来的需求,如果预计对象的构建将变得复杂,或者可能需要多种表示,则使用创建者模式可能是一个明智的选择。

相关文章:

设计模式:创建者模式

定义 创建者模式(Builder Pattern),又称建造者模式,是一种创建型设计模式,它提供了一种创建对象的最佳方式。该模式允许将一个复杂对象的构建与它的表示分离,这样同样的构建过程可以创建不同的表示。创建者…...

【linux】基础IO(四)

在上一篇基础IO中我们主要讲述了文件再磁盘中的存储,当然我们说的也都只是预备知识,为这一篇的文件系统进行铺垫。 目录 搭文件系统的架子:填补细节:inode:datablock[]: 更上层的理解: 搭文件系统的架子&a…...

集合框架(数组,Arrays.sort,list,map,set,stack,queue)蓝桥杯习题

前言(基本知识) List集合 有序&#xff0c;接口&#xff0c; List<引用数据类型> listnew ArrayList<>(); 方法&#xff1a; add() size() get()//索引index从0开始&#xff0c;返回对应的值 isEmpty()判断是否包含该元素,不包含返回true&#xff0c;包含返…...

【C++基础】运算符和流程控制语句

C中的运算符和流程控制语句 一、运算符1. C和Java在通用运算符中的不同之处对比2. C中的位运算符2.1 移位运算符2.2 位逻辑运算符 3. 运算时的类型转换总结3.1 隐式类型转换3.2 显式类型转换&#xff08;强制类型转换&#xff09; 4. 注意 二、流程控制语句1. C和Java在通用流程…...

AOF文件重写

1.2.3.AOF文件重写 因为是记录命令&#xff0c;AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作&#xff0c;但只有最后一次写操作才有意义。通过执行bgrewriteaof命令&#xff0c;可以让AOF文件执行重写功能&#xff0c;用最少的命令达到相同效果。 如图&am…...

第四次面试总结 — 嘉和智能 - 全栈开发

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对专栏 “本人真实面经” 很感兴趣o (ˉ▽ˉ&#xff1b;) 专栏 —— 本人真实面经&#xff0c;更多真实面试经验&#xff0c;中大厂面试总结等您挖掘 目录 总结&#xff08;非详细&#xff09; 面试内…...

tx-lcn使用

tx-lcn是啥 tx-lcn是一个分布式事务框架&#xff0c;有两个模块组成管理端&#xff08;server&#xff09;和client端。 管理端用于分布式事务的注册&#xff0c;事务消息接收&#xff0c;事务消息下发等管理工作。 client端包括事务发起方&#xff0c;事务参与方。 LCN名称是…...

oracle恢复异常处理

问题现象&#xff1a; RMAN> 2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> 16> 17> 18> 19> 20> 21> 22> 23> 24> using target database control file instead of recovery catalog allocate…...

谈谈什么是 Redis

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…...

备战蓝桥杯(java)(日益更新)

备战蓝桥杯&#xff08;java&#xff09;&#xff08;日益更新&#xff09; 文章目录 备战蓝桥杯&#xff08;java&#xff09;&#xff08;日益更新&#xff09;前言&#xff1a;一、c 到 java 须要注意的地方&#xff1a;二、多练java代码&#xff1a;&#xff08;用java代码…...

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储文本数据。字符串变量可以包含字母、数字、符号等字符&#xff0c;并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息&#xff1a; 定义字符串变量&#xff1…...

python画图Matplotlib和Seaborn

python画图Matplotlib和Season 一、Matplotlib1、介绍2、安装3、内容二、Seaborn1、介绍2、安装3、内容一、Matplotlib Matplotlib官网 1、介绍 Matplotlib 是一个 Python 的绘图库,用于创建高质量的二维图表和一些基本的三维图表。它广泛应用于科学计算、数据分析、工程学和…...

一体式I/O模块与RS485串口联动,实现工业网络无缝对接

在现代工业自动化领域中&#xff0c;一体化I/O模块和RS485串口的联动应用已经成为实现工业设备高效、稳定通信的关键技术手段之一。这种联动机制能够有效地将各种现场设备的数据实时、准确地传输到上位机系统&#xff0c;从而实现工业网络的无缝对接。 一体化I/O模块&#xff…...

如何在Uniapp真机中使用H.265无插件流媒体播放器EasyPlayer

流媒体播放器EasyPlayer是TSINGSEE青犀流媒体组件系列中关注度较高的产品&#xff0c;经过多年的发展和迭代&#xff0c;目前已经有多个应用版本&#xff0c;包括RTSP版、RTMP版、Pro版&#xff0c;以及js版&#xff0c;其中js版本作为网页播放器&#xff0c;受到了用户的广泛使…...

【MySQL数据库 | 第二十五篇】深入探讨MVCC底层原理

前言&#xff1a; 在当今互联网时代&#xff0c;数据库扮演着数据存储和管理的关键角色。对于大型Web应用程序和企业级系统而言&#xff0c;高效地处理并发访问和事务管理是至关重要的。多版本并发控制&#xff08;MVCC&#xff09;是一种数据库事务处理的技术&#xff0c;旨…...

【LAMMPS学习】八、基础知识(1.6) LAMMPS 与其他代码耦合

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...

ArrayList中多线程的不安全问题

ArrayList中的不安全问题 正常的输出 List<String> list Arrays.asList("1","2","3"); list.forEach(System.out::println);为什么可以这样输出&#xff0c;是一种函数是接口&#xff0c;我们先过个耳熟 Arrys.asList是返回一个ArrayL…...

ALTER TABLE 之 定点变更(in-place alter)

定点变更算法可以提供优于慢速变更算法的诸多性能优势&#xff1a; 定点变更算法&#xff1a; 1&#xff0c;增加了表的可用性 ALTER TABLE操作使用定点变更算法时&#xff0c;其他用户稍后可以访问该表&#xff0c;因为数据库服务器只在更新表定义和重建包含更改列的索引时才锁…...

【RAG实践】Rerank,让大模型 RAG 更近一步

RAGRerank原理 上一篇【RAG实践】基于LlamaIndex和Qwen1.5搭建基于本地知识库的问答机器人 我们介绍了什么是RAG&#xff0c;以及如何基于LLaMaIndex和Qwen1.5搭建基于本地知识库的问答机器人&#xff0c;原理图和步骤如下&#xff1a; 这里面主要包括包括三个基本步骤&#…...

私有化客服系统:在线客服搭建与部署的创新之路

随着互联网技术的飞速发展&#xff0c;企业与客户之间的沟通方式也在不断地演变。在这个信息爆炸的时代&#xff0c;一个高效、便捷、智能的在线客服系统成为了企业提升服务质量、增强客户满意度的重要工具。本文将详细介绍在线客服系统的构建、部署以及私有化客服的优势&#…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...