建造者模式(大话设计模式)C/C++版本

建造者模式

在这里插入图片描述

C++

参考:https://www.cnblogs.com/Galesaur-wcy/p/15907863.html

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;// Product Class,产品类,由多个部件组成。
class Product
{
private:vector<string> parts;public:// 添加产品部件void Add(string part){parts.push_back(part);}// 显示所有的产品部件void Show(){std::cout << "产品  创建" << std::endl;for_each(parts.cbegin(), parts.cend(), [](const string &s){ cout << s << " "; });cout << endl;}
};// Builder,抽象建造者,并声明一个得到产品建造后结果的方法GetResult。
class Builder
{
public:virtual ~Builder() = default;virtual void BuildPartA() = 0;virtual void BuildPartB() = 0;virtual Product *GetResult() = 0;
};// ConcreteBuilder1,具体建造者类,实现Builder接口中的具体方法。
class ConcreteBuilder1 : public Builder
{
private:Product *product = new Product;public:void BuildPartA() override{product->Add("部件A");}void BuildPartB() override{product->Add("部件B");}Product *GetResult() override{return product;}
};// ConcreteBuilder2,具体建造者类,实现Builder接口中的具体方法。
class ConcreteBuilder2 : public Builder
{
private:Product *product = new Product;public:void BuildPartA() override{product->Add("部件X");}void BuildPartB() override{product->Add("部件Y");}Product *GetResult() override{return product;}
};class Director //  指挥者类,指挥建造Product的过程(控制构建各部分组件的顺序)。
{
public:void Construct(Builder *const b){b->BuildPartA();b->BuildPartB();}
};int main()
{// 用户并不需要知道具体的建造过程,只需指定建造 Product 具体类型。Director director;Builder *b1 = new ConcreteBuilder1;Builder *b2 = new ConcreteBuilder2;cout << "用ConcreteBuilder1的方法建造产品: " << endl;director.Construct(b1);Product *p1 = b1->GetResult();p1->Show();cout << endl;cout << "用ConcreteBuilder2的方法建造产品: " << endl;director.Construct(b2);Product *p2 = b2->GetResult();p2->Show();cout << endl;delete p2;delete p1;delete b1;delete b2;p2 = p1 = nullptr;b1 = b2 = nullptr;return 0;
}

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 产品部件
typedef struct Product
{char **parts;size_t parts_count;
} Product;// 构建者接口
typedef struct Builder
{void (*build_part_a)(Product *);void (*build_part_b)(Product *);Product *(*get_result)(void *);
} Builder;// 具体构建者基类,用于存储产品实例
typedef struct ConcreteBuilder
{Product product;
} ConcreteBuilder;// 导演类
typedef struct Director
{void (*construct)(struct Director *, Builder *, void *, Product **);
} Director;// 初始化产品
void init_product(Product *product)
{product->parts = NULL;product->parts_count = 0;
}// 释放产品
void free_product(Product *product)
{if (product->parts != NULL){int i;for (i = 0; i < product->parts_count; ++i){free(product->parts[i]);}free(product->parts);}
}// 添加部件到产品
void add_part(Product *product, const char *part)
{product->parts = (char **)realloc(product->parts, sizeof(char *) * (product->parts_count + 1));product->parts[product->parts_count++] = strdup(part);
}// 展示产品部件
void show_product(Product *product)
{printf("产品    创建:\n");int i;for (i = 0; i < product->parts_count; ++i){printf("%s ", product->parts[i]);}printf("\n");
}// 实现ConcreteBuilder1的构建方法
void build_part_a_concrete_builder1(Product *product)
{add_part(product, "部件A");
}void build_part_b_concrete_builder1(Product *product)
{add_part(product, "部件B");
}// 实现ConcreteBuilder2的构建方法
void build_part_a_concrete_builder2(Product *product)
{add_part(product, "部件X");
}void build_part_b_concrete_builder2(Product *product)
{add_part(product, "部件Y");
}// 获取结果的通用实现,确保安全返回产品实例
Product *get_result_common(void *builder_void_ptr)
{ConcreteBuilder *builder = (ConcreteBuilder *)builder_void_ptr;return &builder->product;
}// 导演类构建方法
void construct(Director *director, Builder *builder, void *builder_void_ptr, Product **result)
{builder->build_part_a((Product *)builder_void_ptr);builder->build_part_b((Product *)builder_void_ptr);*result = builder->get_result(builder_void_ptr);
}int main()
{// 初始化DirectorDirector director = {.construct = construct};// 初始化ConcreteBuilder实例ConcreteBuilder builder1;init_product(&builder1.product);Builder b1 = {.build_part_a = build_part_a_concrete_builder1,.build_part_b = build_part_b_concrete_builder1,.get_result = get_result_common};ConcreteBuilder builder2;init_product(&builder2.product);Builder b2 = {.build_part_a = build_part_a_concrete_builder2,.build_part_b = build_part_b_concrete_builder2,.get_result = get_result_common};Product *p1 = NULL;Product *p2 = NULL;printf("使用ConcreteBuilder1的方法建造产品: \n");director.construct(&director, &b1, &builder1, &p1);show_product(p1);puts("");printf("使用ConcreteBuilder2的方法建造产品: \n");director.construct(&director, &b2, &builder2, &p2);show_product(p2);puts("");free_product(p1);free_product(p2);return 0;
}

总结

  1. 创建者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式;
  2. 使得建造代码与表示代码分离,隐藏了该产品是如何组装的,多疑若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白跟做江科大32单片机之定时器输出比较

原理部分 背景 GPIO口是数字输出端口&#xff0c;只能输出1和0。但是通过PWM&#xff0c;可以使其控制LED呼吸灯亮灭的程度 1.通过CNT和CCR进行比较&#xff0c;可以输出一定频率和占空比的PWM波形 2.通用定时器有4个CCR&#xff0c;可同时输出4路PWM波形&#xff0c;但只有…

智慧消防新篇章:可视化数据分析平台引领未来

一、什么是智慧消防可视化数据分析平台&#xff1f; 智慧消防可视化数据分析平台&#xff0c;运用大数据、云计算、物联网等先进技术&#xff0c;将消防信息以直观、易懂的图形化方式展示出来。它不仅能够实时监控消防设备的运行状态&#xff0c;还能对火灾风险进行预测和评估…

Unity | Tilemap系统

目录 一、准备工作 1.插件导入 2.资源导入 二、相关组件介绍 1.Grid组件 2.Tilemap组件 3.Tile 4.Tile Palette 5.Brushes 三、动态创建地图 四、其他功能 1.移动网格上物体 2.拖拽缩放地图 Unity Tilemap系统为2D游戏开发提供了一个直观且功能强大的平台&#xff…

【知识点】std::thread::detach std::lock_guard std::unique_lock

在 C11 中&#xff0c;std::thread 提供了并发编程的基础设施&#xff0c;使得我们可以创建和管理线程。std::thread 的 detach 方法是一种常用的线程管理方式&#xff0c;允许线程在后台独立运行&#xff0c;而不必与主线程同步或等待其完成。 std::thread::detach 方法 当你…

【LeetCode最详尽解答】125-验证回文串 Valid-Palindrome

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 链接: 125-验证回文串 直觉 这个问题需要使用一些内置函数&#xff0c;比如 s[l].isalnum() 和 s[l].…

springboot整合security

整合Spring Security到Spring Boot项目中可以帮助你实现认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;&#xff0c;从而保护你的应用程序资源和数据。下面是一个基本的步骤指南&#xff0c;帮助你在Spring Boot项目中整合和配置Spri…

Docker运行 Redis、Mysql、Nginx、MongoDB、Minio等

Redis 挂载文件&#xff0c;自行选择 wget http://download.redis.io/redis-stable/redis.conf 创建对应的文件 mkdir -p /docker/redis/data mkdir -p /docker/redis/conf touch /docker/redis/conf/redis.conf # redis.conf什么的都不能是空docker pull redis:6.0.8dock…

Web前端真实简历:深入解析关键要点与技巧

Web前端真实简历&#xff1a;深入解析关键要点与技巧 在数字化快速发展的今天&#xff0c;Web前端技术已成为互联网行业的核心领域之一。一份真实而引人注目的Web前端简历&#xff0c;对于求职者来说至关重要。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入…

C++ 55 之 多继承

#include <iostream> #include <string> using namespace std;class Base08_1{ public:int m_a;Base08_1(){this->m_a 10;} };class Base08_2{ public:// int m_b;int m_a;Base08_2(){// this->m_b 20;this->m_a 30;} };// 多继承 继承的类型都要…

GenICam标准(一)

系列文章目录 GenICam标准&#xff08;一&#xff09; GenICam标准&#xff08;二&#xff09; GenICam标准&#xff08;三&#xff09; GenICam标准&#xff08;四&#xff09; GenICam标准&#xff08;五&#xff09; GenICam标准&#xff08;六&#xff09; 文章目录 系列文…

非对称加密系统解析

目录 1. 概述 2. 非对称加密标准 2.1 RSA 2.2 SM2 2.2.1 SM2私钥 2.2.2 SM2公钥 2.2.3 加密数据格式 2.2.4 签名数据格式 1. 概述 非对称加密中&#xff0c;密钥分为加密密钥和解密密钥两种。发送者用加密密钥对消息进行加密&#xff0c;接收者用解密密钥对密文进行解密…

Zookeeper:客户端命令行操作

文章目录 一、help二、ls path三、create四、get path五、set六、stat七、delete八、deleteall 一、help 显示所有操作命令。 二、ls path 使用ls命令来查看当前znode的子节点[可监听] w&#xff1a;监听子节点变化。s&#xff1a;附加次级信息。 三、create 普通创建&am…

DOM的概念?获取html元素的方法有哪些?

Dom文档对象模型&#xff0c;对js的HTML具有操作能力。 获取HTML的方法&#xff1a; Document.getElementById(‘’) 通过元素 id 来查找元素&#xff1b; Document.getElementsByClassName(‘’) 通过类名来查找元素; Document.getElementsByName(‘’) 通过表单元素中 na…

element--el-table添加合计后固定列x轴滚动条无法滚动问题

效果图 改变固定列滚轮高度问题 解决文章 解决方案 使用到的参数 pointer-events 属性用来控制一个元素能否响应鼠标操作&#xff0c;常用的关键字有 auto 和 none pointer-events: none; 让一个元素忽略鼠标操作 pointer-events: auto; 还原浏览器设定的默认行为 代码演示 添…

web前端网上私活:探索、挑战与成长的独特之旅

web前端网上私活&#xff1a;探索、挑战与成长的独特之旅 在这个数字化飞速发展的时代&#xff0c;Web前端网上私活成为了越来越多开发者的选择。它不仅仅是一种获取额外收入的方式&#xff0c;更是一种挑战自我、提升技能、拓宽视野的独特旅程。接下来&#xff0c;我将从四个…

JVM-GC-基础知识

JVM-GC-基础知识 前言 JVM中的GC使用Root Searching寻找垃圾单独方式&#xff0c;并结合mark-sweep、copying、mark-compact三种清除算法形成了各有特点的垃圾回收器&#xff0c;且垃圾回收器的演变过程是因为内存空间的不断增大的必然原因。 JVM-GC的发展史 JVM垃圾回收分…

解释时间复杂度和空间复杂度的概念

在算法和数据结构的学习中&#xff0c;时间复杂度和空间复杂度是两个至关重要的概念。它们用于衡量算法在执行过程中所需要的时间和空间资源。下面我将从技术难点、面试官关注点、回答吸引力以及代码举例四个方面来详细解释这两个概念。 一、技术难点 时间复杂度 定义与理解…

Python文本处理:初探《三国演义》

Python文本处理&#xff1a;初探《三国演义》 三国演义获取文本文本预处理分词与词频统计引入停用词后进行词频统计分析人物出场次数结果可视化完整代码 三国演义 《三国演义》是中国古代四大名著之一&#xff0c;它以东汉末年到晋朝统一之间的历史为背景&#xff0c;讲述了魏…

Mongodb使用$pop删除数组中的元素

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第67篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

使用PyTorch实现LSTM生成ai诗

最近学习torch的一个小demo。 什么是LSTM&#xff1f; 长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;是一种循环神经网络&#xff08;RNN&#xff09;的变体&#xff0c;旨在解决传统RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM引入了…