建造者模式和工厂模式的区别
工厂模式和建造者模式都是创建型设计模式,它们的主要作用都是为了简化对象的创建过程,但是它们在设计意图和实现细节上有着显著的区别。
总结区别:
关注点不同:
- 工厂模式关注的是对象的创建。
- 建造者模式关注的是对象的构造过程。
复杂度不同:
- 工厂模式通常用于创建单个对象。
- 建造者模式用于创建具有复杂结构的对象。
使用场景:
- 工厂模式适用于当创建逻辑简单且对象创建后直接可用的情况。
- 建造者模式适用于需要一步步构建复杂对象的情况。
工厂模式(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…...

ETL技术在金蝶云星空与旺店通WMS集成中的应用
金蝶云星空数据集成到旺店通WMS的技术案例分享 在数字化转型的背景下,现代企业对系统间的数据集成需求日益增加。本篇文章将以“组装入库>其他入库单-1”方案为例,详细解析如何通过轻易云数据集成平台,实现金蝶云星空与旺店通WMS之间的数…...

【力扣热题100】3194. 最小元素和最大元素的最小平均值【Java】
题目:3194.最小元素和最大元素的最小平均值 你有一个初始为空的浮点数数组 averages。另给你一个包含 n 个整数的数组 nums,其中 n 为偶数。 你需要重复以下步骤 n / 2 次: 从 nums 中移除 最小 的元素 minElement 和 最大 的元素 maxElement…...

机器学习拟合过程
import numpy as np import matplotlib.pyplot as plt# 步骤1: 生成模拟数据 np.random.seed(0) X 2 * np.random.rand(100, 1) y 4 3 * X 2 * X**2 np.random.randn(100, 1)# 步骤2: 定义线性模型 (我们从随机权重开始) w np.random.randn(2, 1) b np.random.randn(1)#…...

如何快速部署一套智能化openGauss测试环境
一、openGauss介绍 openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行,允许用户自由地复制、使用、修改和分发软件。openGauss内核深度融合了华为在数据库领域多年的研发经验,结合企业级场景需求,持续构建竞争力…...

【设计模式】深入理解Python中的原型设计模式
深入理解Python中的原型设计模式 在软件开发中,有时需要创建对象的过程非常复杂或者代价较高,而在同一类对象的实例之间有很多重复的属性。为了避免重复构造对象,提升性能和效率,原型设计模式(Prototype Pattern&…...

Django CORS配置方案
参考 https://pypi.org/project/django-cors-headers/ 在setting.py中设置 INSTALLED_APPS [......corsheaders, #添加此行 ]MIDDLEWARE[......corsheaders.middleware.CorsMiddleware, #添加此行django.middleware.common.CommonMiddleware,#django.middleware.csrf.CsrfVi…...

2024年开放式耳机哪个牌子好?推荐最好的顶级开放式耳机品牌
在当下,开放式耳机逐渐成为众多消费者的新宠。与传统入耳式耳机相比,开放式耳机展现出诸多独特之处。它可以呈现出更清晰的音质效果,让用户有更美妙的听觉体验。在佩戴感上,开放式耳机更为舒适,不会给耳朵带来压迫感。…...

零基础读懂Stable Diffusion!
前言 一文搞懂Stable Diffusion是什么,怎么训练和使用,语义信息影响生成图片的过程。>>[][加入极市CV技术交流群,走在计算机视觉的最前沿] 前几个月AIGC可谓是大热了一把,各种高质量的生成图片层出不穷,而其中…...

Hash Join 和 Index Join工作原理和性能差异
在数据库查询中,Hash Join 和 Index Join 是两种常见的表连接策略。了解它们的工作原理和性能差异有助于设计高效的数据库查询。我们可以使用 Java 模拟这两种不同的连接方式,并进行性能对比。 1. Hash Join 和 Index Join 的概念: Hash Joi…...

Apifox简介及使用
Apifox 是一款集 API文档管理、接口调试、接口自动化测试 和 Mock 功能于一体的全功能工具,旨在为开发者和测试人员提供一个高效的一站式解决方案。它融合了 Postman、Swagger、JMeter 等工具的优势,能够极大地提升团队协作和 API 开发的效率。 在实际开…...