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

文章目录

  • 建造者模式(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,一经查实,立即删除!

相关文章

每日一题(4)

有一只蜗牛位于二维坐标系的原点(0,0)&#xff0c;在x轴上有n根平行于y轴的竹竿&#xff0c;它们底部的纵坐标为0&#xff0c;横坐标分别为x_1,x_2,\cdots,x_n。蜗牛想要从原点走到第n根竹竿的底部(x_n,0)。蜗牛在x轴上的移动速度是1单位每秒&#xff0c;在竹竿上向上爬的速度是…

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;作为智…

记录vue+elementUI table的组件

可展示图片&#xff0c; 可使用slot插槽添加逻辑&#xff0c; 循环表cloumn&#xff0c; 循环添加操作配置actionButtons <el-tablev-loading"loading":data"tableData"borderstyle"width: 100%"selection-change"selectChange"…

图像配准有哪些技术?

目录 图像配准技术 1.基于特征的图像配准 2.基于强度的图像配准 3.基于模型的图像配准 4.基于学习的图像配准 5.混合方法 图像配准的应用 图像配准技术入门 常见问题解答 图像配准是计算机视觉和医学成像中的一项关键技术&#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…

使用正则表达式提取PDF文件页数的实现方案

文章目录 背景介绍实现原理代码实现1. 基础函数结构2. 页数提取逻辑3. 使用示例 正则表达式解析优点与局限性优点局限性 错误处理建议性能优化建议最佳实践建议总结参考资源 背景介绍 在Web应用开发中,我们经常需要获取上传PDF文件的页数信息。虽然可以使用pdf.js等第三方库,但…

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;如果不勾选可能程序只会…

详细解读sedex验厂

SEDEX验厂&#xff0c;即供货商商业道德信息交流认证&#xff08;Supplier Ethical Data Exchange&#xff09;&#xff0c;是一种表明企业遵守商业道德的认证。以下是对SEDEX验厂的详细解读&#xff1a; 一、SEDEX验厂概述 SEDEX是一家总部位于英国伦敦的非营利组织&#xf…

2.4 设备管理

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