重温设计模式--建造者模式

文章目录

  • 建造者模式(Builder Pattern)概述
  • 建造者模式UML图
  • 作用:
  • 建造者模式的结构
    • 产品(Product):
    • 抽象建造者(Builder):
    • 具体建造者(Concrete Builder):
    • 指挥者(Director):
  • C++ 代码示例1
  • C++示例代码2

建造者模式(Builder Pattern)概述

定义:
建造者模式是一种创建型设计模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。也就是说,它把对象的创建逻辑和表示逻辑分离开来,让代码结构更加清晰,便于维护和扩展。

建造者模式UML图

在这里插入图片描述

作用:

便于创建复杂对象:对于那些具有多个属性、构造过程比较复杂的对象,使用建造者模式可以分步来构建对象,使创建过程更有条理。例如,创建一个包含多个部件的电脑对象,要配置 CPU、内存、硬盘等多种组件,通过建造者模式能清晰地完成配置过程。
提高代码的可维护性和可读性:把对象构建的各个步骤封装在不同的方法中,相比于在构造函数中罗列大量参数或者在一个方法里写复杂的初始化逻辑,代码结构更加清晰,后续阅读和维护代码时更容易理解对象的构建流程。
实现不同的构建配置:可以通过不同的建造者实现来创建对象的不同配置版本,比如对于一款游戏角色,可以创建不同属性配置的角色实例,满足不同场景需求。

建造者模式的结构

产品(Product):

这是最终要创建的复杂对象,它通常包含多个部件或者属性,比如上述提到的电脑对象,其内部有 CPU、内存、硬盘等不同的成员变量来构成完整的电脑实体。

抽象建造者(Builder):

它定义了创建产品各个部件的抽象方法,以及返回最终产品对象的抽象方法。比如对于电脑的抽象建造者,会有抽象的配置 CPU、配置内存等方法,还有获取构建好的电脑的抽象方法。

具体建造者(Concrete Builder):

实现了抽象建造者中定义的抽象方法,具体地来构建产品的各个部件,按照特定的逻辑和配置完成产品的组装,每个具体建造者可以创建出具有不同配置特点的产品。

指挥者(Director):

它负责指挥建造者进行对象的构建,通过调用建造者的相关方法来按顺序完成产品的创建过程,不过它并不关心具体的构建细节,只是协调构建步骤。

C++ 代码示例1

以下以创建一个简单的电脑对象为例来展示建造者模式的代码实现:

#include<iostream>
#include<string>// 产品类:电脑
class Computer
{
private:std::string cpu;int memory;int hardDisk;
public:void setCpu(const std::string& cpu){this->cpu = cpu;}void setMemory(int memory){this->memory = memory;}void setHardDisk(int hardDisk){this->hardDisk = hardDisk;}void showInfo(){std::cout << "CPU: " << cpu << std::endl;std::cout << "Memory: " << memory << "GB" << std::endl;std::cout << "Hard Disk: " << hardDisk << "GB" << std::endl;}
};// 抽象建造者类
class ComputerBuilder
{
public:virtual void buildCpu() = 0;virtual void buildMemory() = 0;virtual void buildHardDisk() = 0;virtual Computer* getComputer() = 0;
};// 具体建造者类,创建高配电脑
class HighEndComputerBuilder :public ComputerBuilder 
{
private:Computer* computer;
public:HighEndComputerBuilder() {computer = new Computer();}void buildCpu() override{computer->setCpu("Intel Core i9");}void buildMemory() override{computer->setMemory(32);}void buildHardDisk() override{computer->setHardDisk(1024);}Computer* getComputer() override{return computer;}
};// 具体建造者类,创建低配电脑
class LowEndComputerBuilder :	public ComputerBuilder
{
private:Computer* computer;
public:LowEndComputerBuilder(){computer = new Computer();}void buildCpu() override {computer->setCpu("Intel Core i3");}void buildMemory() override {computer->setMemory(8);}void buildHardDisk() override{computer->setHardDisk(256);}Computer* getComputer() override{return computer;}
};// 指挥者类
class Director
{
private:ComputerBuilder* builder;
public:void setBuilder(ComputerBuilder* builder) {this->builder = builder;}Computer* construct(){builder->buildCpu();builder->buildMemory();builder->buildHardDisk();return builder->getComputer();}
};int main()
{Director director;// 创建高配电脑HighEndComputerBuilder highEndBuilder;director.setBuilder(&highEndBuilder);Computer* highEndComputer = director.construct();highEndComputer->showInfo();// 创建低配电脑LowEndComputerBuilder lowEndBuilder;director.setBuilder(&lowEndBuilder);Computer* lowEndComputer = director.construct();lowEndComputer->showInfo();delete highEndComputer;delete lowEndComputer;return 0;
}

在上述代码中:
Computer类就是产品类,代表要构建的电脑对象,有设置各部件属性和展示自身信息的方法。
ComputerBuilder是抽象建造者,定义了构建电脑各部件及获取电脑对象的抽象方法。
HighEndComputerBuilder和LowEndComputerBuilder是具体建造者,分别按照高配和低配的配置来构建电脑对象。
Director类作为指挥者,通过调用建造者的方法来协调完成电脑对象的构建过程,最终客户端代码(main函数中)可以方便地通过指挥者和不同的建造者配合,创建出不同配置的电脑对象,整个创建过程条理清晰,易于扩展和维护。

C++示例代码2

#include<iostream>
#include<list>
#include<string>
using namespace std;class product
{list<string>ls;
public:void add(string m_str){ls.push_back(m_str);}void show(){list<string>::iterator itr = ls.begin();for(;itr!=ls.end();++itr){cout<<*itr<<endl;}}
};
class builder
{
public:virtual void head(){};virtual void body(){};virtual void leg(){};virtual void hand(){};virtual product getresult(){product s;return s;};
};class  conbuild1:public builder
{
private:product *m_product;
public:conbuild1(){m_product = new product();}void head(){m_product->add("1的头");}void body(){m_product->add("1的身体");}void leg(){m_product->add("1的腿");}void hand(){m_product->add("1的手");}product getresult(){return *m_product;}
};class  conbuild2:public builder
{
private:product *m_product;
public:conbuild2(){m_product = new product();}void head(){m_product->add("2的头");}void body(){m_product->add("2的身体");}void leg(){m_product->add("2的腿");}void hand(){m_product->add("2的手");}product getresult(){return *m_product;}
};class director
{
public:void createpeople(builder *s){s->body();s->hand();s->leg();s->head();}
};int main()
{director s;builder *p1 = new conbuild1;builder*p2 = new conbuild2;s.createpeople(p1);product s1 = p1->getresult();s1.show();cout<<"---------------"<<endl;s.createpeople(p2);product s2 = p2->getresult();s2.show();
}

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

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

相关文章

arcgisPro相接多个面要素转出为完整独立线要素

1、使用【面转线】工具&#xff0c;并取消勾选“识别和存储面邻域信息”&#xff0c;如下&#xff1a; 2、得到的线要素&#xff0c;如下&#xff1a;

51单片机仿真摇号抽奖机源程序 12864液晶显示

资料下载地址&#xff1a;51单片机仿真摇号抽奖机源程序12864液晶显示仿真程序 一、功能介绍 单片机连接12864&#xff08;st7920&#xff09;液晶显示器和1个按键接INT0&#xff0c;模拟一个抽奖机。 实现效果&#xff1a; 1、液晶初始显示“祝你好运&#xff01;”&#xff…

如何在 Ubuntu 22.04 上安装 Graylog 开源日志管理平台

简介 Graylog 的开源特性、丰富的功能、灵活性和可扩展性使其成为一个流行的日志管理平台。在本教程中&#xff0c;我将向你展示如何在 Ubuntu 22.04 上安装 Graylog&#xff0c;包括配置 Graylog 服务器软件包和访问 Graylog Web UI。 Graylog 是什么&#xff1f; Graylog …

技术发展历程:从 CORBA 到微服务

CORBA CORBA&#xff08;Common Object Request Broker Architecture&#xff09;诞生于上世纪 90 年代初期&#xff0c;由 OMG 组织提出&#xff0c;它作为一种开创性的分布式对象技术规范&#xff0c;在当时的计算机领域引起了轰动。其核心构成部分——接口定义语言&#xf…

抢单人机交互「新红利」!哪些细分赛道“多金”?

受终端用户的智能座舱体验需求驱动&#xff0c;视觉、听觉、触觉等人机交互方式加速焕新。 一方面&#xff0c;人机多模交互引领&#xff0c;车载声学进入新周期。根据高工智能汽车研究院统计数据&#xff0c;单车的车载扬声器搭载量正在快速起量。 很显然&#xff0c;作为智…

前端学习DAY26(华为平板页面)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>平板图片</title><style> .box{text-al…

算法 双指针技巧

文章目录 双指针[leetcode167 两数之和](https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/)分析题解 [leetcode88 合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/)分析题解 [leetcode142 环形链表](https://lee…

DevOps工程技术价值流:制品库Nexus与Harbor的实战探索

制品库作为DevOps价值流中的一个关键环节&#xff0c;其重要性日益凸显。制品库&#xff0c;作为存储和管理软件开发过程中产生的各种制品&#xff08;如代码包、镜像、配置文件等&#xff09;的仓库&#xff0c;是连接开发、测试、部署等多个环节的桥梁。它不仅能够实现制品的…

R9000P键盘失灵解决办法

问题描述 突然&#xff0c;就是很突然&#xff0c;我买的R9000P 2024不到三个月&#xff0c;键盘突然都不能用了&#xff0c;是所有键盘按键都无效的那种。&#xff08;可以使用外接键盘&#xff09; 解决办法 我本科室友说的好哈&#xff0c;全坏全没坏。 &#xff08;该解…

潜在狄利克雷分配LDA 算法深度解析

引言 潜在狄利克雷分配&#xff08;Latent Dirichlet Allocation, LDA&#xff09;是一种广泛应用于文本挖掘和信息检索领域的主题模型。它能够从文档集合中自动发现隐藏的主题结构&#xff0c;为理解大规模文本数据提供了强有力的工具。本文将着重讲解 LDA 的核心理论&#x…

sentinel学习笔记6-限流降级(上)

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…

全面解析 Kubernetes 流量负载均衡:iptables 与 IPVS 模式

目录 Kubernetes 中 Service 的流量负载均衡模式 1. iptables 模式 工作原理 数据路径 优点 缺点 适用场景 2. IPVS 模式 工作原理 数据路径 优点 缺点 适用场景 两种模式的对比 如何切换模式 启用 IPVS 模式 验证模式 总结 Kubernetes 中 Service 的流量负载…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果&#xff0c;它们在底层是怎样做的&#xff1f; 2.Spring给我们提供了很多扩展点&#xff0c;这些有了解吗&#xff1f; 3.MVC分层介绍一下&#xff1f; 4.了解SpringMVC的处理流程吗&#xff1f; 5.Handlermapping 和 handleradapter有…

蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)

一、工程模版创建流程 第一步 创建新项目 第二步 选择型号和管脚封装 第三步 RCC使能 外部时钟&#xff0c;高速外部时钟 第四步晶振时钟配置 由数据手册7.1可知外部晶振频率为24MHz 最后一项设置为80 按下回车他会自动配置时钟 第五步&#xff0c;如果不勾选可能程序只会…

2.4 设备管理

文章目录 设备管理概述设备管理技术磁盘调度 设备管理概述 设备管理是操作系统中最繁杂、与硬件关系紧密的部分。 设备可以按照数据组织、资源分配、数据传输率分类。 数据组织&#xff1a;分为块设备&#xff08;ex. 磁盘&#xff09;、字符设备(ex. 打印机)。资源分配&#…

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…

PSDK的编译与ROS包封装

本文档讲述在NIVIDIA开发板上使用大疆提供的Payload SDK获取无人机实时GPS信息的方法&#xff0c;以及基于Payload SDK发布ROS GPS话题信息的方法。 文章目录 0 实现目标1 Payload SDK1.1 PSDK 源码的编译1.2 PSDK 的使用 2 遥测数据的读取2.1 示例代码结构2.2 读取机载GPS信息…

模型 课题分离

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例&#xff1a;李晓的故事 李晓&#xff0c;一位28岁的软件工程师&#xff0c;在北京打拼。他面临着工作、家庭和感情的多重…

大恒相机开发(3)—大恒相机工业检测的实际案例

大恒相机工业检测的实际案例 工业检测的实际案例图像采集性能优化技巧工业环境下的稳定性 工业检测的实际案例 以下是一些使用大恒相机进行工业检测的实际案例&#xff1a; 多特征光学成像系统&#xff1a; 在这个案例中&#xff0c;使用大恒相机构建了一个全方位、多特征的图…

go官方日志库带色彩格式化

go默认的 log 输出的日志样式比较难看&#xff0c;所以通过以下方式进行了美化和格式化&#xff0c;而且加入了 unicode 的ascii码&#xff0c;进行色彩渲染。 package mainimport ("fmt""log""os""runtime""strings""…