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

C++中的生成器模式

目录

生成器模式(Builder Pattern)

实际应用

构建一辆汽车

构建一台计算机

构建一个房子

总结


生成器模式(Builder Pattern)

生成器模式是一种创建型设计模式,它允许你分步骤创建复杂对象。与其他创建型模式不同的是,生成器模式允许你在一个过程中创建一个对象,而无需等待所有部分都准备好。这种模式特别适用于需要构造不同表示或状态的复杂对象时。

实际应用

1. 需要构造的对象包含多个部分,且需要分步骤创建。
2. 希望使用相同的创建过程来构造不同表示的对象。
3. 构造过程需要能够被隔离和独立变化。

构建一辆汽车

假设我们有一个`Car`类,它有很多可选属性,例如车的颜色、发动机类型、轮胎类型等等。

#include <iostream>
#include <string>class Car {
public:std::string color;std::string engine;std::string tires;std::string interior;void show() {std::cout << "Car Details:\n"<< "Color: " << color << "\n"<< "Engine: " << engine << "\n"<< "Tires: " << tires << "\n"<< "Interior: " << interior << "\n";}
};class CarBuilder {
private:Car car;
public:CarBuilder& setColor(const std::string& color) {car.color = color;return *this;}CarBuilder& setEngine(const std::string& engine) {car.engine = engine;return *this;}CarBuilder& setTires(const std::string& tires) {car.tires = tires;return *this;}CarBuilder& setInterior(const std::string& interior) {car.interior = interior;return *this;}Car build() {return car;}
};int main() {CarBuilder builder;Car car = builder.setColor("Red").setEngine("V8").setTires("Sport").setInterior("Leather").build();car.show();return 0;
}

构建一台计算机

假设我们有一个`Computer`类,它有很多可选属性,例如CPU类型、RAM大小、存储类型和大小等等。

#include <iostream>
#include <string>class Computer {
public:std::string cpu;int ram;std::string storageType;int storageSize;void show() {std::cout << "Computer Details:\n"<< "CPU: " << cpu << "\n"<< "RAM: " << ram << " GB\n"<< "Storage Type: " << storageType << "\n"<< "Storage Size: " << storageSize << " GB\n";}
};class ComputerBuilder {
private:Computer computer;
public:ComputerBuilder& setCPU(const std::string& cpu) {computer.cpu = cpu;return *this;}ComputerBuilder& setRAM(int ram) {computer.ram = ram;return *this;}ComputerBuilder& setStorageType(const std::string& storageType) {computer.storageType = storageType;return *this;}ComputerBuilder& setStorageSize(int storageSize) {computer.storageSize = storageSize;return *this;}Computer build() {return computer;}
};int main() {ComputerBuilder builder;Computer computer = builder.setCPU("Intel i9").setRAM(32).setStorageType("SSD").setStorageSize(1024).build();computer.show();return 0;
}

构建一个房子

假设我们有一个`House`类,它有很多可选属性,例如房间数量、楼层数量、花园是否存在、是否有车库等等。

#include <iostream>
#include <string>class House {
public:int rooms;int floors;bool garden;bool garage;void show() {std::cout << "House Details:\n"<< "Rooms: " << rooms << "\n"<< "Floors: " << floors << "\n"<< "Garden: " << (garden ? "Yes" : "No") << "\n"<< "Garage: " << (garage ? "Yes" : "No") << "\n";}
};class HouseBuilder {
private:House house;
public:HouseBuilder& setRooms(int rooms) {house.rooms = rooms;return *this;}HouseBuilder& setFloors(int floors) {house.floors = floors;return *this;}HouseBuilder& setGarden(bool garden) {house.garden = garden;return *this;}HouseBuilder& setGarage(bool garage) {house.garage = garage;return *this;}House build() {return house;}
};int main() {HouseBuilder builder;House house = builder.setRooms(5).setFloors(2).setGarden(true).setGarage(true).build();house.show();return 0;
}

总结

每个生成器类负责设置对象的各个属性,并在最终构建出对象。

相关文章:

C++中的生成器模式

目录 生成器模式&#xff08;Builder Pattern&#xff09; 实际应用 构建一辆汽车 构建一台计算机 构建一个房子 总结 生成器模式&#xff08;Builder Pattern&#xff09; 生成器模式是一种创建型设计模式&#xff0c;它允许你分步骤创建复杂对象。与其他创建型模式不同…...

基于python的PDF文件解析器汇总

基于python的PDF文件解析器汇总 大多数已发表的科学文献目前以 PDF 格式存在&#xff0c;这是一种轻量级、普遍的文件格式&#xff0c;能够保持一致的文本布局和格式。对于人类读者而言&#xff0c; PDF格式的文件内容展示整洁且一致的布局有助于阅读&#xff0c;可以很容易地…...

C++多线程同步总结

C多线程同步总结 关于C多线程同步 一、C11规范下的线程库 1、C11 线程库的基本用法&#xff1a;创建线程、分离线程 #include<iostream> #include<thread> #include<windows.h> using namespace std; void threadProc() {cout<<"this is in t…...

【机器学习】基于CNN-RNN模型的验证码图片识别

1. 引言 1.1. OCR技术研究的背景 1.1.1. OCR技术能够提升互联网体验 随着互联网应用的广泛普及&#xff0c;用户在日常操作中频繁遇到需要输入验证码的场景&#xff0c;无论是在登录、注册、支付还是其他敏感操作中&#xff0c;验证码都扮演着重要角色来确保安全性。然而&am…...

一文读懂Samtec分离式线缆组件选型 | 快速攻略

【摘要/前言】 2023年&#xff0c;全球线缆组件市场规模大致在2100多亿美元。汽车和电信行业是线缆组件最大的两个市场&#xff0c;中国和北美是最大的两个制造地区。有趣的是&#xff0c;特定应用&#xff08;即定制&#xff09;和矩形组件是两个最大的产品组。 【Samtec产品…...

批量申请SSL证书如何做到既方便成本又最低

假如您手头拥有1千个域名&#xff0c;并且打算为每一个域名搭建网站&#xff0c;那么在当前的网络环境下&#xff0c;您必须确保这些网站通过https的方式提供服务。这意味着&#xff0c;您将为每一个域名申请SSL证书&#xff0c;以确保网站数据传输的安全性和可信度。那么&…...

Python 设计模式(创建型)

文章目录 抽象工厂模式场景示例 单例模式场景实现方式 工厂方法模式场景示例 简单工厂模式场景示例 建造者模式场景示例 原型模式场景示例 抽象工厂模式 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种将一组相关…...

PyTorch 索引与切片-Tensor基本操作

以如下 tensor a 为例&#xff0c;展示常用的 indxing, slicing 及其他高阶操作 >>> a torch.rand(4,3,28,28) >>> a.shape torch.Size([4, 3, 28, 28])Indexing: 使用索引获取目标对象&#xff0c;[x,x,x,....] >>> a[0].shape torch.Size([3, 2…...

深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手

我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木&#xff0c;我们可以构建出城堡、飞机、甚至整个城市。现在&#xff0c;想象一下如果有一个数字世界的乐高&#xff0c;我们可以用这样的“积木”来构建智能程序&#xff0c;这些程序能够阅读、理解和撰写文本&#xf…...

scss是什么安装使⽤的步骤

当谈到SCSS时&#xff0c;我们首先需要了解它是什么。SCSS&#xff0c;也称为Sassy CSS&#xff0c;是Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;的一种语法&#xff0c;它是CSS的预处理器&#xff0c;允许你使用变量、嵌套规则、混合&#xff08;mixin&a…...

Pspark从hive读数据写到Pgsql数据库

前提条件 要使用PySpark从Hive读取数据并写入到PostgreSQL数据库&#xff0c;你需要确保以下几点&#xff1a; 你的PySpark环境已经配置好&#xff0c;并且能够连接到你的Hive数据。 PostgreSQL JDBC驱动程序已经添加到你的PySpark环境中。 你已经在PostgreSQL中创建好了相应…...

Pixi.js学习 (六)数组

目录 前言 一、数组 1.1 定义数组 1.2 数组存取与删除 1.3 使用数组统一操作敌机 二、实战 例题一&#xff1a;使用数组统一操作敌机 例题一代码&#xff1a; 总结 前言 为了提高作者的代码编辑水品&#xff0c;作者在使用博客的时候使用的集成工具为 HBuilderX。 下文所有截…...

操作系统复习-Linux的文件系统

文件系统概述 FAT FAT(File Allocation Table)FAT16、FAT32等&#xff0c;微软Dos/Windows使用的文件系统使用一张表保存盘块的信息 NTFS NTFS (New Technology File System)WindowsNT环境的文件系统NTFS对FAT进行了改进&#xff0c;取代了日的文件系统 EXT EXT(Extended…...

代码随想录算法训练营第三十六天| 860.柠檬水找零、 406.根据身高重建队列、 452. 用最少数量的箭引爆气球

LeetCode 860.柠檬水找零 题目链接&#xff1a;https://leetcode.cn/problems/lemonade-change/description/ 文章链接&#xff1a;https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html 思路 贪心算法&#xff1a;遇见20的时候有两种找零的…...

如何在C#中实现多线程

在C#中实现多线程有多种方式,包括使用System.Threading.Thread类、System.Threading.Tasks.Task类、System.Threading.Tasks.Parallel类以及异步编程模型(async和await)。下面我将为你展示每种方法的基本用法。 1. 使用System.Threading.Thread类 using System; using Syst…...

【LLM】快速了解Dify 0.6.10的核心功能:知识库检索、Agent创建和工作流编排(二)

【LLM】快速了解Dify 0.6.10的核心功能&#xff1a;知识库检索、Agent创建和工作流编排&#xff08;二&#xff09; 文章目录 【LLM】快速了解Dify 0.6.10的核心功能&#xff1a;知识库检索、Agent创建和工作流编排&#xff08;二&#xff09;一、创建一个简单的聊天助手&#…...

【介绍下Pandas,什么是Pandas?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

linux系统安装anaconda,并通过java程序调用python程序

虚拟环境准备 首先准备一块空的分区&#xff0c;安装anaconda至少要20g以上才能执行简单程序&#xff0c;这里准备20G的磁盘空间 创建分区,执行以下步骤&#xff0c;之后执行reboot重启 fdisk /dev/sda p n 回车 回车 w查看当前系统创建的分区&#xff0c;我这里是名为sda3的…...

Stable diffusion的SDXL模型,针不错!(含实操)

与之前的SD1.5大模型不同&#xff0c;这次的SDXL在架构上采用了“两步走”的生图方式&#xff1a; 以往SD1.5大模型&#xff0c;生成步骤为 Prompt → Base → Image&#xff0c;比较简单直接&#xff1b;而这次的SDXL大模型则是在中间加了一步 Refiner。Refiner的作用是什么呢…...

wordpress轻量免费主题

WordPress建站公司 适合提供WordPress建站服务的公司或个体(个人)工作室使用的WordPress建站公司主题模板。 https://www.jianzhanpress.com/?p545 首屏大图红色简洁wordpress主题 首屏大图红色简洁wordpress主题&#xff0c;非常地高端大气上档次&#xff0c;可用于多个行…...

OpenCV4编译后pkg-config失效?教你如何正确生成opencv4.pc文件(附完整CMake参数)

OpenCV4编译实战&#xff1a;从源码构建到pkg-config配置全解析 在Linux环境下从源码编译OpenCV4是许多计算机视觉开发者的必经之路&#xff0c;但不少人在成功编译后却发现pkg-config --modversion opencv命令报错"找不到opencv包"。这并非你的操作失误&#xff0c;…...

图解DySAT:5张信息图带你吃透动态图表示学习的自注意力机制

动态图神经网络DySAT&#xff1a;用自注意力机制捕捉时空演化的5个关键视角 当我们在社交网络上关注好友动态时&#xff0c;既会注意不同朋友间的关联强度&#xff08;谁和谁互动更密切&#xff09;&#xff0c;也会追踪这些关系随时间的变化模式&#xff08;某段关系何时变得亲…...

PLC新手必看:三菱FX2N顺序功能图的5个常见错误及解决方法

三菱FX2N顺序功能图实战避坑指南&#xff1a;从原理到调试的完整解决方案 第一次接触三菱FX2N的顺序功能图编程时&#xff0c;那种既兴奋又忐忑的心情至今记忆犹新。看着逻辑清晰的流程图在仿真中运行失常&#xff0c;或是设备突然"抽风"时的茫然&#xff0c;是每个P…...

OpenClaw多用户方案:QwQ-32B共享环境下的权限隔离

OpenClaw多用户方案&#xff1a;QwQ-32B共享环境下的权限隔离 1. 为什么需要多用户方案&#xff1f; 去年我在家里搭建了一个OpenClaw自动化环境&#xff0c;原本只是个人使用。直到某天家人看到我用语音指令让AI自动整理照片、生成周报后&#xff0c;纷纷要求"共享&quo…...

MATLAB实战:手把手教你实现FM调制解调(附完整代码与避坑指南)

MATLAB实战&#xff1a;从零构建FM通信系统的完整指南 在无线通信领域&#xff0c;频率调制(FM)技术因其出色的抗噪声性能&#xff0c;至今仍广泛应用于广播、对讲机等场景。对于通信工程学生和MATLAB初学者而言&#xff0c;亲手实现一个完整的FM调制解调系统&#xff0c;是理解…...

车辆信号震动信号的滤波、幅值与能量分析——基于测试台采集文件ssjlbpp.m等的研究

车辆信号的震动信号的滤波、幅值以及能量分析&#xff0c;信号是利用测试台采集回来的 文件列表&#xff1a; ssjlbpp.m cxssjlbpp.m ssj.m fuzhissj.m翻了翻硬盘里压箱底的车辆测试台数据&#xff0c;哦对&#xff0c;还有那堆当时随手起的.mat之外的.m文件&#xff1a;ssjlbp…...

别再只调库了!拆解一个智能家居语音项目,聊聊STM32裸机开发中多任务处理的几种实用思路

裸机开发的艺术&#xff1a;STM32智能家居项目中多任务处理的五种高阶策略 从智能家居项目看裸机开发的挑战与机遇 在嵌入式开发领域&#xff0c;RTOS&#xff08;实时操作系统&#xff09;的普及让许多开发者形成了思维定式——面对多任务需求时&#xff0c;第一反应往往是移植…...

基于智能体(Agent)的自动化图像工作流:Wan2.2-I2V-A14B与任务编排

基于智能体&#xff08;Agent&#xff09;的自动化图像工作流&#xff1a;Wan2.2-I2V-A14B与任务编排 1. 引言&#xff1a;当图像生成遇上智能体 想象一下这样的场景&#xff1a;你需要为电商平台制作一组节日主题的广告图&#xff0c;包含特定风格的背景、商品展示和人物互动…...

从CMSIS-DAP到JTAG:一篇讲透Keil5/Keil4下ARM芯片的下载与调试设置差异

从CMSIS-DAP到JTAG&#xff1a;深度解析Keil环境下ARM芯片调试接口的实战差异 当你在Keil环境中从STM32F103切换到STM32F407时&#xff0c;是否遇到过下载算法突然失效的情况&#xff1f;或是更换了J-Link仿真器后&#xff0c;原本流畅的调试过程变得寸步难行&#xff1f;这些问…...

B站视频下载工具终极指南:3分钟快速上手,轻松保存你喜欢的每一帧画面

B站视频下载工具终极指南&#xff1a;3分钟快速上手&#xff0c;轻松保存你喜欢的每一帧画面 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/G…...