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

创建型模式3.建造者模式

创建型模式

  1. 工厂方法模式(Factory Method Pattern)
  2. 抽象工厂模式(Abstract Factory Pattern)
  3. 建造者模式(Builder Pattern)
  4. 原型模式(Prototype Pattern)
  5. 单例模式(Singleton Pattern)

建造者模式(Builder Pattern) 是一种创建型设计模式,旨在通过一步步构建复杂对象,解耦对象的构建过程和表示方式。建造者模式允许你用相同的构建过程创建不同的表示(即不同类型的复杂对象)。这使得对象的创建过程更加灵活,同时避免了在构造函数中使用大量的参数。

关键概念

  • Builder(建造者):负责构建一个产品的各个部分,并提供一个方法来获取构建完成的产品。
  • ConcreteBuilder(具体建造者):实现了 Builder 接口,负责构建产品的各个部分,并提供获取产品的功能。
  • Product(产品):由建造者构建的复杂对象,包含多个部分。
  • Director(指挥者):指挥构建过程,负责使用 Builder 来构建产品。Director 并不关心产品的具体组成部分,只是按照特定的步骤来创建产品。

适用场景

  • 当对象的构建过程非常复杂时,且构建过程中的不同步骤可以按照一定的顺序进行组合。
  • 当一个产品的创建过程必须允许不同的表示(例如同一产品的不同版本或变种)。
  • 当对象的构建过程需要控制创建对象的不同部分的顺序。

优缺点分析

优点:
  1. 解耦复杂对象的构建与表示:建造者模式将对象的创建过程从对象本身分离出来,使得客户端可以只关心如何构建,而不用关心如何表示。
  2. 灵活性强:同一个建造过程可以构建不同的表示。
  3. 避免构造函数参数过多:如果一个对象需要多个构造参数,通过建造者模式可以将这些参数逐一设置,避免构造函数参数列表过于复杂。
  4. 产品的一致性:产品的构建是由 Director 负责的,可以确保产品的构建过程是统一且符合一定顺序的。
缺点:
  1. 增加类的数量:需要创建多个具体建造者类和指挥者类,会增加系统的复杂性。
  2. 适用于较为复杂的对象构建:对于简单对象的创建,使用建造者模式可能会显得过于复杂。

代码示例

1. 定义产品类(Product

假设我们要创建一个表示汽车的对象,汽车有多个组成部分(如发动机、轮胎、车窗等)。

// 产品类(Product)
public class Car {private String engine;private String wheels;private String windows;public void setEngine(String engine) {this.engine = engine;}public void setWheels(String wheels) {this.wheels = wheels;}public void setWindows(String windows) {this.windows = windows;}@Overridepublic String toString() {return "Car{" +"engine='" + engine + '\'' +", wheels='" + wheels + '\'' +", windows='" + windows + '\'' +'}';}
}

2. 定义建造者接口(Builder

建造者接口定义了构建产品的各个步骤。

// 建造者接口(Builder)
public interface CarBuilder {void buildEngine();void buildWheels();void buildWindows();Car getResult();
}

3. 实现具体建造者(ConcreteBuilder

具体建造者负责实现 CarBuilder 接口,构建汽车的不同部分。

// 具体建造者类(ConcreteBuilder)
public class SportsCarBuilder implements CarBuilder {private Car car;public SportsCarBuilder() {car = new Car();}@Overridepublic void buildEngine() {car.setEngine("V8 Engine");}@Overridepublic void buildWheels() {car.setWheels("Sports Wheels");}@Overridepublic void buildWindows() {car.setWindows("Tinted Windows");}@Overridepublic Car getResult() {return car;}
}

4. 定义指挥者类(Director

指挥者类负责按顺序构建产品,使用建造者来创建不同的产品。

// 指挥者类(Director)
public class Director {private CarBuilder carBuilder;public Director(CarBuilder carBuilder) {this.carBuilder = carBuilder;}public Car construct() {carBuilder.buildEngine();carBuilder.buildWheels();carBuilder.buildWindows();return carBuilder.getResult();}
}

5. 客户端代码

客户端通过指挥者来构建复杂对象。

// 客户端
public class BuilderPatternTest {public static void main(String[] args) {// 创建具体建造者对象CarBuilder builder = new SportsCarBuilder();// 创建指挥者对象Director director = new Director(builder);// 指挥者根据建造者构建对象Car car = director.construct();// 输出构建好的对象System.out.println(car);}
}

变种:可选参数

建造者模式可以支持可选的参数,允许客户端根据需要选择是否构建某些部分。例如,在上面的例子中,如果用户不需要车窗,CarBuilder 可以提供一个不设置窗户的建造方法。

总结

建造者模式通过分步骤、分部分地构建复杂对象,极大地解耦了对象的构建和表示过程。这种模式的优点是能够应对对象的复杂性,同时提供灵活的创建过程。它常用于产品(如汽车、电脑等)的构建过程较为复杂、包含多个可选部分的场景。通过使用建造者模式,可以使得创建不同类型的对象更加灵活,并保持较高的可维护性。

相关文章:

创建型模式3.建造者模式

创建型模式 工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern)单例模式(Singleto…...

【集成学习】Boosting算法详解

文章目录 1. 集成学习概述2. Boosting算法详解3. Gradient Boosting算法详解3.1 基本思想3.2 公式推导 4. Python实现 1. 集成学习概述 集成学习(Ensemble Learning)是一种通过结合多个模型的预测结果来提高整体预测性能的技术。相比于单个模型&#xf…...

【Orca】Orca - Graphlet 和 Orbit 计数算法

Orca(ORbit Counting Algorithm)是一种用于对网络中的小图进行计数的有效算法。它计算网络中每个节点的节点和边缘轨道(4 节点和 5 节点小图)。 orca是一个用于图形网络分析的工具,主要用于计算图中的 graphlets&#…...

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景 实现效果 本案例展示了如何使用Three.js创建一个带有红蓝配置的半球光源的场景,并在其中添加一个旋转的球体。通过设置不同的光照参数,可以观察到球体表面材质的变化。 知识点 WebGLRenderer …...

【Git原理和使用】Git 分支管理(创建、切换、合并、删除、bug分支)

一、理解分支 我们可以把分支理解为一个分身,这个分身是与我们的主身是相互独立的,比如我们的主身在这个月学C,而分身在这个月学java,在一个月以后我们让分身与主身融合,这样主身在一个月内既学会了C,也学…...

义乌购的反爬虫机制怎么应对?

在面对义乌购的反爬虫机制时,可以采取以下几种策略来应对: 1. 使用代理IP 义乌购可能会对频繁访问的IP地址进行限制,因此使用代理IP可以有效地隐藏爬虫的真实IP地址,避免被封禁。可以构建一个代理IP池,每次请求时随机…...

消息中间件面试

RabbitMQ 如何保证消息不丢失 消息重复消费 死信交换机 消息堆积怎么解决 高可用机制 Kafka 如何保证消息不丢失 如何保证消息的顺序性 高可用机制 数据清理机制 实现高性能的设计...

基于CLIP和DINOv2实现图像相似性方面的比较

概述 在人工智能领域,CLIP和DINOv2是计算机视觉领域的两大巨头。CLIP彻底改变了图像理解,而DINOv2为自监督学习带来了新的方法。 在本文中,我们将踏上一段旅程,揭示定义CLIP和DINOv2的优势和微妙之处。我们的目标是发现这些模型…...

利用Python爬虫获取API接口:探索数据的力量

引言 在当今数字化时代,数据已成为企业、研究机构和个人获取信息、洞察趋势和做出决策的重要资源。Python爬虫作为一种高效的数据采集工具,能够帮助我们自动化地从互联网上获取大量的数据。而API接口作为数据获取的重要途径之一,为我们提供了…...

【LeetCode】力扣刷题热题100道(1-5题)附源码 链表 子串 中位数 回文子串(C++)

目录 1.两数之和 2.两数相加-链表 3.无重复字符的最长子串 4.寻找两个正序数组的中位数 5.最长回文子串 1.两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。…...

Docker启动失败 - 解决方案

Docker启动失败 - 解决方案 问题原因解决方案service问题 问题 重启docker失败: toolchainendurance:~$ sudo systemctl restart docker Job for docker.service failed because:the control process exited with error codesee:"systemctl status docker.se…...

【Duilib】 List控件支持多选和获取选择的多条数据

问题 使用Duilib库写的一个UI页面用到了List控件,功能变动想支持选择多行数据。 分析 1、List控件本身支持使用SetMultiSelect接口设置是否多选: void SetMultiSelect(bool bMultiSel);2、List控件本身支持使用GetNextSelItem接口获取选中的下一个索引…...

android系统的一键编译与非一键编译 拆包 刷机方法

1.从远程仓库下载源码 别人已经帮我下载好了在Ubuntu上。并给我权限:chmod -R ow /data/F200/F200-master/ 2.按照readme.txt步骤操作 安装编译环境: sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential z…...

SQL语言的函数实现

SQL语言的函数实现 引言 随着大数据时代的到来,数据的存储和管理变得越来越复杂。SQL(结构化查询语言)作为关系数据库的标准语言,其重要性不言而喻。在SQL语言中,函数是一个重要的组成部分,可以有效地帮助…...

OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)

前篇博客有对常用LSA的总结 2类LSA(Network-LSA) DR产生泛洪范围为本区域 作用:  描述MA网络拓扑信息和网络信息,拓扑信息主要描述当前MA网络中伪节点连接着哪几台路由。网络信息描述当前网络的 掩码和DR接口IP地址。 影响邻居建立中说到…...

运动相机拍摄的视频打不开怎么办

3-10 GoPro和大疆DJI运动相机的特点,小巧、高清、续航长、拍摄稳定,很多人会在一些重要场合用来拍摄视频,比如可以用来拿在手里拍摄快速运动中的人等等。 但是毕竟是电子产品,有时候是会出点问题的,比如意外断电、摔重…...

SpringBoot | 使用Apache POI库读取Excel文件介绍

关注WX:CodingTechWork 介绍 在日常开发中,我们经常需要处理Excel文件中的数据。无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到需要读取和操作Excel文件的场景。本文将详细介绍如何使用Java中的Apache PO…...

从configure.ac到构建环境:解析Mellanox OFED内核模块构建脚本

在软件开发过程中,特别是在处理复杂的内核模块如Mellanox OFED(OpenFabrics Enterprise Distribution)时,构建一个可移植且高效的构建系统至关重要。Autoconf和Automake等工具在此过程中扮演着核心角色。本文将深入解析一个用于准备Mellanox OFED内核模块构建环境的Autocon…...

c#使用SevenZipSharp实现压缩文件和目录

封装了一个类,方便使用SevenZipSharp,支持加入进度显示事件。 双重加密压缩工具范例: using SevenZip; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.…...

【从0带做】基于Springboot3+Vue3的高校食堂点餐系统

大家好,我是武哥,最近给大家手撸了一个基于SpringBoot3Vue3的高校食堂点餐系统,可用于毕业设计、课程设计、练手学习,系统全部原创,如有遇到网上抄袭站长的,欢迎联系博主~ 详细介绍 https://www.javaxm.c…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...

日常一水C

多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)

零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...

Unity-ECS详解

今天我们来了解Unity最先进的技术——ECS架构(EntityComponentSystem)。 Unity官方下有源码,我们下载源码后来学习。 ECS 与OOP(Object-Oriented Programming)对应,ECS是一种完全不同的编程范式与数据架构…...

Qt 按钮类控件(Push Button 与 Radio Button)(1)

文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button(鼠标点击不放连续移动快捷键) Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...

NLP常用工具包

✨做一次按NLP项目常见工具的使用拆解 1. tokenizer from torchtext.data.utils import get_tokenizertokenizer get_tokenizer(basic_english) text_sample "Were going on an adventure! The weather is really nice today." tokens tokenizer(text_sample) p…...