建造者模式和工厂模式的区别
工厂模式和建造者模式都是创建型设计模式,它们的主要作用都是为了简化对象的创建过程,但是它们在设计意图和实现细节上有着显著的区别。
总结区别:
关注点不同:
- 工厂模式关注的是对象的创建。
- 建造者模式关注的是对象的构造过程。
复杂度不同:
- 工厂模式通常用于创建单个对象。
- 建造者模式用于创建具有复杂结构的对象。
使用场景:
- 工厂模式适用于当创建逻辑简单且对象创建后直接可用的情况。
- 建造者模式适用于需要一步步构建复杂对象的情况。
工厂模式(Factory Pattern)
工厂模式旨在定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法让类的实例化推迟到子类。
特点
- 主要关注点:工厂模式专注于创建对象的过程,是一种对象创建的接口。
- 使用场景:当你不希望用户直接创建对象实例,或当创建过程涉及一些复杂的逻辑时。
- 实现方式:通常通过一个工厂类或工厂方法来创建对象。
工厂模式(Factory Pattern)示例
假设我们有一个应用程序需要创建不同类型的车辆,比如汽车(Car)和卡车(Truck)。这些车辆有一些共同的属性和方法,但具体实现不同。工厂模式可以帮助我们封装创建这些不同类型车辆的逻辑。
代码示例
#include <iostream>
#include <memory>// 产品接口
class Vehicle {
public:virtual void drive() = 0;virtual ~Vehicle() = default;
};// 具体产品1:汽车
class Car : public Vehicle {
public:void drive() override {std::cout << "Driving a car!" << std::endl;}
};// 具体产品2:卡车
class Truck : public Vehicle {
public:void drive() override {std::cout << "Driving a truck!" << std::endl;}
};// 工厂类
class VehicleFactory {
public:enum VehicleType { CAR, TRUCK };static std::unique_ptr<Vehicle> createVehicle(VehicleType type) {if (type == CAR) {return std::make_unique<Car>();} else if (type == TRUCK) {return std::make_unique<Truck>();}return nullptr;}
};int main() {auto car = VehicleFactory::createVehicle(VehicleFactory::CAR);car->drive();auto truck = VehicleFactory::createVehicle(VehicleFactory::TRUCK);truck->drive();return 0;
}
建造者模式(Builder Pattern)
建造者模式旨在将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
特点
- 主要关注点:建造者模式专注于一步一步构建复杂对象。
- 使用场景:当创建复杂对象的过程独立于对象的组成部分,以及其创建过程必须允许不同的表示时。
- 实现方式:通过一个建造者类来逐步构造最终的复杂对象。
建造者模式(Builder Pattern)示例
假设我们需要创建一个复杂的汉堡(Burger),它有不同的组成部分:面包(bun)、肉饼(patty)、酱料(sauce)等。每个汉堡的组成部分可能不同,建造者模式可以帮助我们一步一步地构建这些复杂对象。
#include <iostream>
#include <string>class Burger {
private:std::string bun;std::string patty;std::string sauce;// 声明 BurgerBuilder 为友元类friend class BurgerBuilder;public:void showBurger() const {std::cout << "Bun: " << bun << ", Patty: " << patty << ", Sauce: " << sauce << std::endl;}
};class BurgerBuilder {
private:Burger burger;public:BurgerBuilder& setBun(const std::string& bunType) {burger.bun = bunType;return *this;}BurgerBuilder& setPatty(const std::string& pattyType) {burger.patty = pattyType;return *this;}BurgerBuilder& setSauce(const std::string& sauceType) {burger.sauce = sauceType;return *this;}Burger build() const {return burger;}
};int main() {BurgerBuilder builder;Burger myBurger = builder.setBun("Sesame").setPatty("Beef").setSauce("BBQ").build();myBurger.showBurger();return 0;
}
区别的具体体现
关注点不同:
- 工厂模式:关注的是“创建类型”。工厂模式封装了创建不同类型对象的逻辑(如汽车和卡车)。它通过工厂来决定创建哪种类型的对象。
- 建造者模式:关注的是“创建复杂对象的步骤”。建造者模式一步一步地构建复杂对象(如汉堡),它允许控制对象创建的每一步。
使用场景不同:
- 工厂模式:适用于需要创建不同类型对象的场景,每种对象都有特定的创建逻辑。比如汽车和卡车,它们是不同的类型,有不同的创建方式。
- 建造者模式:适用于需要创建复杂对象的场景,这些对象的创建步骤是固定的,但每一步可以有不同的配置。比如汉堡的创建过程是固定的,但每个部分(面包、肉饼、酱料)的选择可以不同。
实现方式不同:
- 工厂模式:通过一个工厂类或方法来创建对象。工厂方法根据传入的参数决定创建的对象类型。
- 建造者模式:通过一个建造者类一步一步地构建对象,最终通过一个build方法返回完整的对象。建造者模式更注重构建过程的控制和灵活性。
总结
工厂模式和建造者模式虽然都是创建型模式,但它们解决的是不同的问题。工厂模式更多地用于封装对象创建的复杂性,而建造者模式则是为了逐步构建复杂对象,并且允许构建过程的不同表示。
相关文章:
建造者模式和工厂模式的区别
工厂模式和建造者模式都是创建型设计模式,它们的主要作用都是为了简化对象的创建过程,但是它们在设计意图和实现细节上有着显著的区别。 总结区别: 关注点不同: 工厂模式关注的是对象的创建。建造者模式关注的是对象的构造过程…...
GEE数据集——ERA5-陆地每日汇总--ECMWF气候再分析数据集
目录 简介 数据集说明 Dataset Availability Dataset Provider Collection Snippet 空间信息 Resolution Bands Table 变量 代码 代码链接 结果 引用 许可 网址推荐 0代码在线构建地图应用 机器学习 简介 注(2024-04-19): …...
Spring Boot 中的 @RequestMapping 和 Spring 中的 @RequestMapping 有什么区别?
在Spring框架中,RequestMapping注解用于映射Web请求到处理器(Controller)的方法上。在Spring Boot中,这个注解的使用方式和目的与Spring框架中是完全相同的。RequestMapping注解可以用于类或方法上,以声明请求的映射。…...
PROFINET开发或EtherNet/IP开发嵌入式归一板有用于工业称重秤
这是真实案例。然而,客户选择不展示其品牌名称。 Anybus嵌入式解决方案帮助工业称重设备制造商连接到任何工业网络。多网络连接使称重设备能够轻松访问不同的控制系统,从而加快上市时间。 我们最终找到了HMSNetworks的Anybus解决方案。他们的成熟技术和专…...
【Kafka】Kafka源码解析之producer过程解读
从本篇开始 打算用三篇文章 分别介绍下Producer生产消费,Consumer消费消息 以及Spring是如何集成Kafka 三部分,致于对于Broker的源码解析,因为是scala语言写的,暂时不打算进行学习分享。 总体介绍 clients : 保存的是Kafka客户端…...
深度学习笔记20_数据增强
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境:Python 3.9 2.编译器:Pycharm 3.深度学习环境:TensorFlow 2.10.0 二、GPU设置…...
模板变量与php变量对比做判断
${item.create_name}如何与php变量对比 在PHP中,您可以通过将字符串内嵌到双引号中来将模板变量 ${item.create_name} 与PHP变量进行对比。如果您有一个PHP变量 $phpVariable 并且想要检查它是否与 ${item.create_name} 相同,您可以使用 str_replace 函…...
C语言 | Leetcode C语言题解之第485题最大连续1的个数
题目: 题解: int findMaxConsecutiveOnes(int* nums, int numsSize) {int maxCount 0, count 0;for (int i 0; i < numsSize; i) {if (nums[i] 1) {count;} else {maxCount fmax(maxCount, count);count 0;}}maxCount fmax(maxCount, count);…...
C语言复习概要(六)
公主请阅 1. 深入理解数组与指针在C语言中的应用1.1 数组名的理解 2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序的实现5. 二级指针6. 指针数组7. 指针数组模拟二维数组8.总结 1. 深入理解数组与指针在C语言中的应用 数组与指针是C语言的核心概念之一,理解…...
PyQt 入门教程(2)搭建开发环境
文章目录 一、搭建开发环境1、安装PyQt5与pyqt5-tools2、配置QtDesigner3、配置Pyuic4、配置Pyrcc 一、搭建开发环境 1、安装PyQt5与pyqt5-tools PyQt5: PyQt的开发库。Pyqt5-tools: 它是一个包含多种工具的工具包,旨在帮助开发者更方便地使…...
Flink Kubernetes Operator
Flink Kubernetes Operator是一个用于在Kubernetes集群上管理Apache Flink应用的工具。 一、基本概念 Flink Kubernetes Operator允许用户通过Kubernetes的原生工具(如kubectl)来管理Flink应用程序及其生命周期。它简化了Flink应用在Kubernetes集群上的…...
【最新华为OD机试E卷-支持在线评测】字符统计及重排(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)
🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…...
springboot使用GDAL获取tif文件的缩略图并转为base64
springboot使用GDAL获取tif文件的缩略图并转为base64 首先需要安装gdal:https://blog.csdn.net/qq_61950936/article/details/142880279?spm1001.2014.3001.5501 然后是配置pom.xml文件: <!--处理缩略图的--><dependency><groupId>o…...
Pytorch——pip下载安装pytorch慢的解决办法
一、找到需要下载的pytorch链接 运行:pip install torch1.11.0cu113 torchvision0.12.0cu113 torchaudio0.11.0 --extra-index-url https://download.pytorch.org/whl/cu113。然后得到: 我这里为:https://download.pytorch.org/whl/cu113/t…...
uniapp微信小程序调用百度OCR
uniapp编写微信小程序调用百度OCR 公司有一个识别行驶证需求,调用百度ocr识别 使用了image-tools这个插件,因为百度ocr接口用图片的base64 这里只是简单演示,accesstoken获取接口还是要放在服务器端,不然就暴露了自己的百度项目k…...
Vue3+TS项目---实用的复杂类型定义总结
namespace 概念 在TypeScript中,namespace是一种用于组织代码得结构,主要用于将相关得功能(例如类、接口、函数等)组合在一起。它可以帮助避免命名冲突,尤其是在大项目中。 用法 1.定义命名空间 使用namespace关键…...
尚硅谷rabbitmq2024 工作模式路由篇 第11节 答疑
String exchangeName "test_direct"; /! 创建交换机 人图全 channel.exchangeDeclare(exchangeName,BuiltinExchangeType.DIREcT, b: true, b1: false, b2: false, map: null); /1 创建队列 String queue1Name "test_direct_queue1"; String queue2Name &q…...
HTTP vs WebSocket
本文将对比介绍HTTP 和 WebSocket ! 相关文章: 1.HTTP 详解 2.WebSocket 详解 一、HTTP:请求/响应的主流协议 HTTP(超文本传输协议)是用于发送和接收网页数据的标准协议。它最早于1991年由Tim Berners-Lee提出来&…...
R语言医学数据分析实践-数据读写
【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 R编程环境的搭建-CSDN博客 在分析公共卫生数据时,数…...
JavaWeb环境下Spring Boot在线考试系统的优化策略
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于JavaWeb技术的在线考试系统设计与实现的开发全过程。通过分析基于Java Web技术的在线考试系统设计与实现管理的不足,创建了一个计算机管理基于Ja…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
C++中vector类型的介绍和使用
文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...
未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
