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

05_23 种设计模式之《建造者模式》

文章目录

    • 一、建造者模式基础知识
    • 建造者模式的结构
    • 建造者模式的应用场景

一、建造者模式基础知识

建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种优雅的方式来创建复杂对象,同时隐藏其构建过程。这种模式允许你通过指定复杂对象的类型和内容来构建它们,然后分步骤创建复杂对象的各个部分。

建造者模式的结构

建造者模式通常包含以下角色:
产品(Product):需要构建的复杂对象。
建造者(Builder):提供一个接口,用于创建和表示产品的不同部分。
具体建造者(ConcreteBuilder):实现建造者接口,定义产品对象的各个部分的构建和表示。
指挥者(Director):负责安排已有模块的建造过程,不涉及具体的构建细节。
客户端(Client):使用指挥者和建造者来创建复杂对象。

建造者模式的应用场景

创建复杂对象:当对象的构建过程复杂或者对象本身包含多个成员变量时。
相同的方法,不同的执行顺序:不同的执行顺序可能会导致不同的结果。
分步骤构建:需要分步骤构建对象,每一步都可以独立进行。
隔离复杂对象的构建和表示:客户端不需要知道对象是如何构建的,只需要知道如何使用它。
#pragma once#include <iostream>
#include <string.h>using namespace std;class Phone // 电话类
{
public:Phone();~Phone();void setCamera(string camera);void setBattery(string battery);void setScreen(string screen);void PrintCamera();void PrintBattery();void PrintScreen();private:string strCamera;	// 摄像头string strBattery;	// 电池string strScreen;	// 屏幕
};//----------------------#include "Phone.h"Phone::Phone(){cout << "调用Phone类的构造函数." << endl;
}Phone::~Phone() {cout << "调用Phone类的析构函数." << endl;
}void Phone::setCamera(string camera) {strCamera = camera;
}void Phone::setBattery(string battery) {strBattery = battery;
}void Phone::setScreen(string screen)
{strScreen = screen;
}void Phone::PrintCamera() {cout << "Camera-->" << strCamera.c_str() << endl;
}void Phone::PrintBattery() {cout << "Battery-->" << strBattery.c_str() << endl;
}void Phone::PrintScreen() {cout << "Screen-->" << strScreen.c_str() << endl;
}
#pragma once#include "Phone.h"class Fbuilder // 基类
{
public:Fbuilder();~Fbuilder();protected:Phone* phone; // 电话对象public:virtual void buildCamera() = 0;virtual void buildBattery() = 0;virtual void buildScreen() = 0;virtual Phone* GetPhone();};class IphoneBuilder :public Fbuilder { // 苹果派生类
public:IphoneBuilder();void buildCamera();void buildBattery();void buildScreen();
};class HuaweiBuilder :public Fbuilder { // 华为派生类
public:HuaweiBuilder();void buildCamera();void buildBattery();void buildScreen();
};//------------------------------
#include "Fbuilder.h"Fbuilder::Fbuilder(){}Fbuilder::~Fbuilder() {}Phone* Fbuilder::GetPhone()
{return phone;
}IphoneBuilder::IphoneBuilder() {phone = new Phone;
}
void IphoneBuilder::buildCamera() {phone->setCamera("Iphone Camera Created.");
}
void IphoneBuilder::buildBattery() {phone->setBattery("Iphone Battery Created.");
}
void IphoneBuilder::buildScreen() {phone->setScreen("Iphone Screen Created.");
}HuaweiBuilder::HuaweiBuilder() {phone = new Phone;
}
void HuaweiBuilder::buildCamera() {phone->setCamera("Huawei Camera Created.");
}
void HuaweiBuilder::buildBattery() {phone->setBattery("Huawei Battery Created.");
}
void HuaweiBuilder::buildScreen() {phone->setScreen("Huawei Screen Created.");
}
#pragma once#include "Fbuilder.h"class Director {
public:Director();Director(Fbuilder* builder);~Director();void CreateFunc(Fbuilder* builder);void CreateFunc();private:Fbuilder *dbuilder;
};//---------------------------#include "Director.h"Director::Director() {}// 另一种初始化:Director::Director(Fbuilder* builder):dbuilder(builder)
Director::Director(Fbuilder* builder) {dbuilder = builder;
}Director::~Director() {}void Director::CreateFunc(Fbuilder* builder)
{builder->buildCamera();builder->buildBattery();builder->buildScreen();
}void Director::CreateFunc()
{dbuilder->buildCamera();dbuilder->buildBattery();dbuilder->buildScreen();
}

#include <iostream>
using namespace std;#include "Phone.h"
#include "Director.h"
#include "Fbuilder.h"int main()
{Fbuilder* huawei = new HuaweiBuilder;Fbuilder* iphone = new IphoneBuilder;Director* director = new Director;director->CreateFunc(huawei);director->CreateFunc(iphone);Phone* huaweiphone = huawei->GetPhone();Phone* iphonephone = iphone->GetPhone();huaweiphone->PrintCamera();huaweiphone->PrintScreen();huaweiphone->PrintBattery();cout << endl;iphonephone->PrintCamera();iphonephone->PrintScreen();iphonephone->PrintBattery();return 0;
}

相关文章:

05_23 种设计模式之《建造者模式》

文章目录 一、建造者模式基础知识建造者模式的结构建造者模式的应用场景 一、建造者模式基础知识 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种优雅的方式来创建复杂对象&#xff0c;同时隐藏其构建过程。这种模式允许你通…...

详细分析Spring Security OAuth2中的JwtAccessTokenConverter基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 JwtAccessTokenConverter 是 Spring Security OAuth2 中的一…...

python习题2

1、输出一个年份&#xff0c;判断其是不是闰年 #输入一个年份&#xff0c;判断其是否是闰年 y eval(input()) if y%4 0 and y%100 ! 0:print("是") elif y%4000:print("是") else:print("不是") 2、模拟智能客服&#xff1a; 按1查询账户余额…...

CVSS 4.0 学习笔记

通用漏洞评分系统(CVSS)捕获了主要技术软件、硬件和固件漏洞的特征。其输出包括数字分数,表明与其他漏洞。 以下因素可能包括但不限于:监管要求、客户数量受影响、因违约造成的金钱损失、生命或财产受到威胁,或潜在漏洞的声誉影响。这些因素在CVSS评估范围之外。 CVSS的好…...

解决 GPTQ 模型导入后推理生成 Tokens 速度很慢的问题(从源码重新安装 Auto-GPTQ)

这里解决的是使用 Auto-GPTQ 或者 Transformers 导入 GPTQ 模型后推理速度很慢的问题。 值得注意的是&#xff0c;这个问题很有可能是因为安装不正确&#xff0c;所以 GPTQ 无法正确使用 GPU 进行推理&#xff0c;也就是说无法进行加速&#xff0c;即便 print(model.device) 显…...

NDC美国药品编码目录数据库查询方法

NDC&#xff08;National Drug Code&#xff09;翻译为“国家药品代码”&#xff0c;是美国食品药品监督管理局&#xff08;FDA&#xff09;制定的一种药品标识系统&#xff0c;用于唯一标识药品。这个编码系统主要目的是为精准识别和追踪不同药品而建设&#xff0c;行业人员和…...

vue3的v-model使用

vue3的v-model使用 单个绑定值 子组件 props: [‘modelValue’], emits: [‘update:modelValue’], 注&#xff1a;modelValue是默认的&#xff0c;如果只有一个需要绑定v-model&#xff0c;可使用modelValue 此时父组件写法 <CustomInput v-model"searchText"…...

Go语言实现长连接并发框架 - 消息

文章目录 前言接口结构体接口实现项目地址最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;上篇博客实现了对连接的封装&#xff0c;那我们对连接的读写操作涉及数据格式的定义&#xff0c;我们采用统一的数据格式。使用我们这种数据格式的数据&#xff0c;我们将其称之为…...

湖南(市场咨询)源点调研 如何明确调研焦点与分析单位的特征

湖南市场调研源点咨询认为&#xff0c;调研过程中定义问题阶段的部分工作涉及弄清究竟是对谁进行调研&#xff0c;也就是感兴趣人群&#xff0c;我们发现这与样本的选择有关。在调研过程的设计阶段弄清楚感兴趣人群非常重要&#xff0c;之后才可以决定选择哪种调研类型进行调研…...

java 方法引用与构造器引用

Java 方法引用和构造器引用是 Java 8 引入的重要特性&#xff0c;它们进一步简化了 Lambda 表达式的书写&#xff0c;使得代码更加简洁和易读。下面详细介绍方法引用和构造器引用的概念、用法及示例。 方法引用 方法引用是一种简化 Lambda 表达式的语法糖&#xff0c;它允许通…...

python3的语法

知识简介 基础语法就像比赛规则&#xff0c;比如比赛跑步&#xff0c;咱们不能跑到别人的跑道去吧&#xff0c;比赛打拳&#xff0c;先说好不能踢裆。 正文 一、python3的基础语法 1、编码 python的源码文件.py一般是utf8编码的&#xff0c;有时候咱们在执行源码文件的时候报…...

Spring Data JPA中的锁机制

当多个事务同时修改同一条记录时&#xff0c;可能会导致数据不一致的问题。为了确保并发事务中的数据一致性&#xff0c;可以使用锁机制。常见的两种锁机制是悲观锁和乐观锁。下面是这两种锁机制的详细讲解。 1. 悲观锁&#xff08;Pessimistic Locking&#xff09; 概念&…...

mybatis分页拦截器

Mapper 方法: public interface UserMapper {void selectUsers(@Param("page") Page<User> page...

React学习过程(持续更新......)

React学习过程&#xff08;持续更新…&#xff09; 创建react的hello项目 使用node创建create-react-app脚手架项目 //首先你得先安装node&#xff0c;这里不做详细教程&#xff0c;我使用的node为20.18.0 npm isntall create-react-app -g //全局安装create-react-app crea…...

pve lxc容器探索,陆续完善中

注意&#xff1a;创建lxc容器时&#xff0c;不要勾选“无特权容器”&#xff0c;才可以使用如下命令进行挂载。 说明&#xff1a;容器附加主机目录&#xff0c;/myweb/src为主机目录&#xff0c;/src为lxc中目录&#xff0c;100为容器ID pct set 100 -mp1 /myweb/src,mp/src执…...

5款人声分离免费软件分享,从入门到精通,伴奏提取分分钟拿捏!

人声分离通常是音乐制作、混音和卡拉OK中常用的重要技术之一。它的核心是将乐器伴奏从原始音轨中分离出来&#xff0c;使得用户可以单独处理或重混音频&#xff0c;创造出清晰干净的伴奏轨道。若缺乏强大的音频剪辑软件或专业人声分离工具&#xff0c;这一过程往往会比较困难。…...

镭速助力解决企业大文件传输难题

在数字化时代&#xff0c;数据已成为企业的核心资产。无论是高清视频、大规模数据库备份还是复杂的3D设计文件&#xff0c;企业每天都要处理大量数据。然而&#xff0c;在享受数据带来的便利和价值的同时&#xff0c;企业也面临着一个现实问题——如何高效、安全地传输大文件&a…...

SpringBootWeb AOP

SpringBootWeb AOP 事务管理 rollbackFor属性 propagation属性 案例 AOP 基础 进阶 通知类型 通知顺序 切入点表达式 execution annotation 连接点 案例 实体类 接口方法 切面类 事务管理 rollbackFor属性 propagation属性 REQUIRED:大部分情况下都是用该传播行为…...

傅里叶分析之掐死教程(完整版)更新于2014.06.06

作 者&#xff1a;韩 昊 知 乎&#xff1a;Heinrich 微 博&#xff1a;花生油工人 知乎专栏&#xff1a;与时间无关的故事 谨以此文献给大连海事大学的吴楠老师&#xff0c;柳晓鸣老师&#xff0c;王新年老师以及张晶泊老师。 转载的同学请保留上面这句话&#xff0c;谢谢。如果…...

macOS终端配置自动补全功能

如何在macOS终端中配置自动补全功能 终端是一个非常强大的工具&#xff0c;它可以用来完成很多任务&#xff0c;比如创建、复制、移动、删除文件&#xff0c;执行脚本和运行程序。不过它的默认设置对用户不太友好&#xff0c;作为开发者&#xff0c;我们通常习惯代码编辑器的辅…...

如何构建基于UNet的眼底血管图像分割系统

如何构建基于UNet的眼底血管图像分割系统 文章目录1. 数据预处理2. 定义UNet模型3. 训练过程4. 测试过程5. 日志记录1构建一个基于UNet的眼底血管图像分割系统涉及多个步骤&#xff0c;包括数据预处理、模型定义、训练过程、测试过程以及日志记录。下面是一个完整的指南&#x…...

别再折腾双系统了!Win11/Win10下用WSL2搞定PyTorch+CUDA环境(附YOLOv5实战)

在Windows上打造高效深度学习环境&#xff1a;WSL2PyTorchCUDA全攻略 对于许多刚接触深度学习的开发者来说&#xff0c;环境配置往往是最令人头疼的第一步。传统做法要么是在Windows和Linux双系统间来回切换&#xff0c;要么忍受虚拟机性能低下的问题。而现在&#xff0c;WSL2&…...

【Nanobot】README09_LEVEL4 添加新聊天渠道

【Nanobot】README09_LEVEL4 添加新聊天渠道 源码地址&#xff1a;https://github.com/HKUDS/nanobot &#x1f3af; 目标 指导如何为 nanobot 添加新的聊天渠道&#xff08;如 Signal、Matrix、Line 等&#xff09;。 &#x1f4cb; 添加新 Channel 的步骤 步骤 1&#xff1…...

TencentDB Agent Memory 架构拆解:告别 Agent 失忆,构建四层可追溯记忆与上下文治理系统

拆解 TencentDB Agent Memory 如何用分层记忆、上下文卸载和降级检索&#xff0c;让 Agent 留住工作现场。 原文链接&#xff1a;AI 小老六 Agent 真正难用的地方&#xff0c;往往不是它不会调用工具&#xff0c;而是它记不住工作现场。 你刚给它讲完项目背景、编码偏好、部署…...

工业多串口通信实战:基于EM9170的8串口方案设计与优化

1. 项目概述&#xff1a;为什么8串口在今天依然重要&#xff1f;在物联网、工业自动化、智能楼宇这些领域里摸爬滚打久了&#xff0c;你会发现一个有趣的现象&#xff1a;那些看似“古老”的通信接口&#xff0c;生命力往往比我们想象的要顽强得多。串口&#xff0c;或者说RS-2…...

如何轻松突破Windows限制:WinRing0硬件访问终极实战指南

如何轻松突破Windows限制&#xff1a;WinRing0硬件访问终极实战指南 【免费下载链接】WinRing0 WinRing0 is a hardware access library for Windows. 项目地址: https://gitcode.com/gh_mirrors/wi/WinRing0 你是否曾经在开发Windows应用时&#xff0c;需要直接访问硬件…...

多智能体AI如何自动化代码分析与项目规划:从原理到实践

1. 项目概述&#xff1a;当AI项目经理走进你的代码库 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Harness_Multi-Agent_AI_PM”。光看名字&#xff0c;你可能会觉得这又是一个蹭AI热度的概念性玩具。但作为一个在软件工程和项目管理一线摸爬滚打了十多年的老鸟&…...

开源补丁工具包OpenClaw-Patchkit:无侵入式热更新与二进制修改实战

1. 项目概述&#xff1a;一个开源补丁工具包的深度解析最近在整理一些老项目的维护工具链时&#xff0c;又翻出了mahsumaktas/openclaw-patchkit这个仓库。这名字乍一看有点神秘&#xff0c;“OpenClaw”配上“Patchkit”&#xff0c;让人联想到某种模块化的修补工具。实际上&a…...

i.MX8MP NPU实战:TensorFlow Lite模型移植与VSI-NPU优化全流程

1. 项目概述与核心价值最近在折腾一块基于NXP i.MX8M Plus的开发板&#xff0c;这块板子最大的亮点就是集成了一个专为边缘AI设计的神经处理单元&#xff08;NPU&#xff09;。官方文档里提了一嘴TensorFlow Lite的例程&#xff0c;但真上手去移植&#xff0c;发现坑是一个接一…...

3分钟掌握APK Installer:在Windows电脑上轻松安装安卓应用的终极方案

3分钟掌握APK Installer&#xff1a;在Windows电脑上轻松安装安卓应用的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想在Windows电脑上直接运行An…...