c++实现建造者模式

news/2024/10/20 16:42:11/

在这里插入图片描述

代码

director.h

#pragma once
#include<vector>
#include<string>
#include<iostream>class Product
{
private:std::vector<std::string> _parts;public:void Add(const std::string& part) {_parts.push_back(part);}void show(){std::cout << "product produce----" << std::endl;for (auto item : _parts) {std::cout << item << std::endl;}std::cout << std::endl;}
};class Builder
{
public:virtual void buildPartA() = 0;virtual void buildPartB() = 0;virtual Product* getResult() = 0;
};class ConcreteBuilder1 : public Builder
{
private:Product* _pProduct;public:ConcreteBuilder1() {_pProduct = new Product();}~ConcreteBuilder1() {delete _pProduct;}void buildPartA() override{_pProduct->Add("部件a");}void buildPartB() override{_pProduct->Add("部件b");}// 小心使用。如果该类的对象被析构,得到的指针将为空。Product* getResult() override{if (_pProduct != nullptr) {return _pProduct;}else {return nullptr;}}
};class ConcreteBuilder2 : public Builder
{
private:Product* _pProduct;public:ConcreteBuilder2() {_pProduct = new Product();}~ConcreteBuilder2() {delete _pProduct;}void buildPartA() override{_pProduct->Add("部件x");}void buildPartB() override{_pProduct->Add("部件y");}// 小心使用。如果该类的对象被析构,得到的指针将为空。Product* getResult() override{if (_pProduct != nullptr) {return _pProduct;}else {return nullptr;}}};class Director
{
private:Builder* _pBuilder;public:Director(Builder* p_builder) :_pBuilder(p_builder) {}void construct(){if (_pBuilder != nullptr) {_pBuilder->buildPartA();_pBuilder->buildPartB();}}};

main.cpp

#include<iostream>
#include"Director.h"int main()
{Builder* pBuilder1 = new ConcreteBuilder1();Director* pDirector = new Director(pBuilder1);pDirector->construct(); // 让按builder1的方式生成产品Product* pProduct = pBuilder1->getResult();// 获取产品pProduct->show();Builder* pBuilder2 = new ConcreteBuilder2();pDirector = new Director(pBuilder2);pDirector->construct(); // 让按builder2的方式生成产品pProduct = pBuilder2->getResult(); // 获取产品pProduct->show();delete pDirector;delete pBuilder1;return 0;
}

在这里插入图片描述


http://www.ppmy.cn/news/1192873.html

相关文章

03-Vue中的常用指令的使用,事件及其修饰符

常用指令 指令语法和插值语法 Vue框架中的所有指令的名字都以v-开始,完整语法格式<HTML标签 v-指令名:参数"javascript表达式(表达式的结果是一个值)"></HTML标签>: 指令的职责是当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM元素不是所有…

【进程控制⑥】:进程替换/exec*()系列接口

【进程控制⑥】&#xff1a;进程替换/ exec*(&#xff09;系列接口 一.进程替换原理二.替换特点1.独立性2.唯一性3.不变性4.不返回 三.程序替换应用【exec*系列系统调用】①execl&#xff1a;②execlp&#xff1a;③execv&#xff1a;④execle&#xff1a; 一.进程替换原理 我…

鲁班猫4(RK3588S)配置Realsense SDK和Realsense ROS(D435i T265)

0 环境 鲁班猫4开发板&#xff08;RK3588S&#xff09;Ubuntu 20.04 &#xff08;lubancat-rk3588-ubuntu20.04-gnome-20230829_update&#xff09;D435iT265ROS noeticRealsense SDK v2.53.1Realsense ROS v2.3.2 1 安装ROS 建议使用fishros.com的ROS一键安装 wget http:/…

msvcp120.dll下载修复详细方法与解决方法

MSVCP120.dll文件丢失是一个常见的问题&#xff0c;它通常会导致某些程序无法正常运行。这个问题可能是由于多种原因引起的&#xff0c;例如系统更新、软件卸载或病毒感染等。在这篇文章中&#xff0c;我将为您提供四种解决MSVCP120.dll文件丢失的方法&#xff0c;帮助您快速恢…

Asterisk Ubuntu 安装

更新环境 sudo apt update sudo apt install wget build-essential git autoconf subversion pkg-config libtool sudo contrib/scripts/get_mp3_source.sh A addons/mp3 A addons/mp3/common.c A addons/mp3/huffman.h A addons/mp3/tabinit.c A addons/mp3/Ma…

Day 50 动态规划 part16

Day 50 动态规划 part16 解题理解58372 2道题目 583. 两个字符串的删除操作 72. 编辑距离 解题理解 583 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。 当word1[i -…

零基础Linux_25(多线程)信号量+基于环形队列的生产消费模型+自选锁+读写锁

目录 1. 信号量 1.1 信号量和信号量操作的概念 1.2 信号量的基本使用接口 2. 基于环形队列的生产者消费者模型 2.1 环形队列再分析 2.2 代码分步实现 sem.hpp ringQueue.hpp testMain.cc 2.3 代码解析和再理解 3. 自旋锁和读写锁 3.1 自旋锁的概念和接口 3.2 读写…

diffusers-Load pipelines,models,and schedulers

https://huggingface.co/docs/diffusers/using-diffusers/loadinghttps://huggingface.co/docs/diffusers/using-diffusers/loading 有一种简便的方法用于推理是至关重要的。扩散系统通常由多个组件组成&#xff0c;如parameterized model、tokenizers和schedulers&#xff0c…