当前位置: 首页 > 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;我们通常习惯代码编辑器的辅…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...