c++ 建造者模式

文章目录

  • 建造者模式
    • 为什么使用建造者模式
    • 建造者模式实现步骤
    • 实现示例
    • 建造者模式优缺点

建造者模式

建造者模式(Builder Pattern)是面向对象设计模式中的一种,主要用于创建复杂对象。这种模式将对象的构建过程与其表示分离,允许用户通过相同的构建过程创建不同的表示。以下是建造者模式的一些关键概念:

  • 产品(Product):
    这是最终要创建的复杂对象。产品可能由多个组成部分构成,这些部分可以有不同的表现形式。
  • 抽象建造者(Builder):
    定义了一个用于创建复杂对象的接口,但并不涉及具体的部件和它们的装配方式。它通常包含一系列用于构建产品各个部分的方法。
  • 具体建造者(Concrete Builder):
    实现了抽象建造者接口,负责构建并装配各个部分。具体建造者类通常包含了构建产品各个部分的业务逻辑。
  • 指挥者(Director):
    使用建造者对象中的方法来创建产品对象。指挥者不关心具体产品是如何被构建的,它只负责指导建造者去构建产品。有时,指挥者的职责可以内嵌到客户端代码中。
    在这里插入图片描述

为什么使用建造者模式

主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
建造者模式(Builder Pattern)主要在以下几种情况下使用,以解决特定的设计问题:

  • 对象构造复杂:
    当一个对象的构造过程复杂,涉及到很多不同的选项或配置,而且这些选项之间可能存在依赖关系时,使用建造者模式可以将构造过程分解为一系列小步骤,每个步骤负责设置对象的一部分属性。这使得构造过程更清晰,避免了构造函数中出现大量参数的情况,也使得对象的构造更为灵活。
  • 对象具有多种变体:
    如果一个对象可能有多种不同的配置或表示形式,而这些配置或表示在构造时就已经确定,那么可以使用建造者模式来创建这些变体。通过不同的具体建造者,可以构造出不同配置的对象实例。
  • 构造过程独立于部件:
    建造者模式使构建过程和产品对象的表示相分离,这意味着即使构建过程改变,也不影响产品对象的表示,反之亦然。这有助于维护代码的稳定性和可扩展性。
  • 控制构建过程的顺序:
    某些情况下,对象的构建顺序很重要,而这个顺序可能会随时间变化。建造者模式通过将构建过程委托给Director(指挥者)类来管理,可以很容易地调整构建顺序,而无需修改建造者本身。
  • 减少重复代码:
    当构建相似但不完全相同的产品对象时,建造者模式可以减少重复代码。不同的建造者可以共享相同的构建逻辑,只是在某些步骤上有所不同。
  • 易于扩展和维护:
    如果未来需要增加新的产品特性,只需添加新的建造者类,而无需修改现有的建造者或产品类。这使得系统更容易适应需求变化。

例如,在软件开发中,创建一个复杂的数据库连接工厂可能需要指定不同的数据库类型、驱动程序、连接字符串、身份验证信息等。使用建造者模式,你可以逐步设定这些参数,同时保持代码的清晰和可维护性。

建造者模式实现步骤

1.提供抽象建造者类: 为创建产品各个部分,统一抽象接口

2.提供具体建造者类:具体实现抽象建造者各个部件的接口

3.提供多个具体产品类:具体的创建产品的各个部分

4.提供一个指挥类:负责安排和调度复杂对象的各个建造过程

实现示例

//电脑组装:显示器、鼠标、键盘、主机(主机又包括cpu、显卡、主板等)
//1.找到店铺老板告诉需求
//2.客服安排技术员工组装
//3.产品组装完成
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//电脑组装:显示器、鼠标、键盘、主机(主机又包括cpu、显卡、主板等)
//1.找到店铺老板告诉需求
//2.客服安排技术员工组装
//3.产品组装完成
//抽象产品类
class AbstractProduct 
{
public:virtual void SetDisplayer(string displayer) = 0;virtual void SetMouse(string mouse) = 0;virtual void SetKeyBoard(string keyBoard) = 0;virtual void SetHost(string host) = 0;virtual void Show() = 0;
};
//具体产品类
class Computer :public AbstractProduct
{void SetDisplayer(string displayer){m_list.push_back(displayer);}void SetMouse(string mouse){m_list.push_back(mouse);}void SetKeyBoard(string keyBoard) {m_list.push_back(keyBoard);}void SetHost(string host) {m_list.push_back(host);}void Show() {cout << "电脑配置结果:" << endl;for (auto v : m_list) {cout << v << endl;}}vector<string> m_list;
};
//抽象建造者类
class AbstractBuilder 
{
public:AbstractBuilder():product(new Computer) {}//抽象构造过程virtual void BuildDisplayer(string displayer) = 0;virtual void BuildMouse(string mouse) = 0;virtual void BuildKeyBoard(string keyBoard) = 0;virtual void BuildHost(string host) = 0;AbstractProduct* Getproduct() {return product;}
protected:AbstractProduct* product;
};
//具体的建造者类--->组装电脑的技术员
class ConcreteBuilder :public AbstractBuilder 
{
public:void BuildDisplayer(string displayer) {product->SetDisplayer(displayer);}void BuildMouse(string mouse) {product->SetMouse(mouse);}void BuildKeyBoard(string keyBoard) {product->SetKeyBoard(keyBoard);}void BuildHost(string host) {product->SetHost(host);}
};
//指挥者类
class Director 
{
public:Director(AbstractBuilder* pBuilder) :pBuilder(pBuilder) {}AbstractProduct* createProduct(string displayer, string mouse, string keyBoard, string host) {pBuilder->BuildDisplayer(displayer);pBuilder->BuildMouse(mouse);pBuilder->BuildKeyBoard(keyBoard);pBuilder->BuildHost(host);return pBuilder->Getproduct();}
private:AbstractBuilder* pBuilder;
};int main() 
{AbstractBuilder* pB = new ConcreteBuilder;Director* pD = new Director(pB);AbstractProduct* computer = pD->createProduct("华为显示器", "牧马人鼠标", "雷蛇键盘", "外星人");computer->Show();return 0;
}

建造者模式优缺点

优点

  • 封装性好,构建和表示分离

  • 扩展性好,各个具体的建造者相互独立,有利于系统的解耦

  • 控制细节风险,客户端无需详知细节,建造者细化创建过程

缺点

  • 产品的组成部分必须相同,这限制了其使用范围

  • 产品内部发生变化,建造者需同步修改,后期维护成本较大

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

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

相关文章

python+Selenium自动化之免登录(cookie及token)

目录 cookie免登录 通过接口获取cookie 启用浏览器绕过登录 添加token 使用登录可以减去每次登录的重复操作&#xff0c;直接操作系统登录后的菜单页面&#xff0c;也可以减少安全验证登录&#xff0c;如图像验证登录的操作。注意&#xff1a;cookie和token都有有效期。 c…

京东.Vision首登苹果Vision Pro 背后的技术探索

去年6月&#xff0c;苹果正式发布首款头显设备Apple Vision Pro&#xff0c;今年6月28号&#xff0c;Apple Vision Pro正式在中国发售。京东.Vision作为首批原生应用登陆Vision Pro平台&#xff0c;首期以家电家居与潮流数码产品作为切入口&#xff0c;未来将逐步拓展至全品类&…

第11章 规划过程组(三)(11.11规划成本管理)

第11章 规划过程组&#xff08;三&#xff09;11.11规划成本管理&#xff0c;在第三版教材第403~404页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;成本管理概述 1、成本的类型&#xff08;重要知识点&#xff09; 直接成本 如项目团队差旅费、工资、项目使用的…

【简历】西安某211大学研究生:Java简历面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这个同学是211研究生的一份Java简历,这个简历版面没有问题,但是因为主项目重复度过大,所以导致这个简历的简历通过率会大大降低,面试通过…

从基础到进阶:无线局域网技术解析

在局域网刚刚问世后的一段时间内&#xff0c;无线局域网的发展比较缓慢&#xff0c;其原因是价格贵、数据传输速率低、安全性较差。但自20世纪80年代末以来&#xff0c;由于人们工作和生活节奏的加快&#xff0c;以及移动通信技术的飞速发展&#xff0c;无线局域网逐步进入市场…

前端新手小白的React入坑指南

有个小伙伴跟我说&#xff0c;已经毕业了&#xff0c;开始实习了。但公司现在用的还是Vue&#xff0c;领导说是过段时间让他用React做项目&#xff0c;先自己学习起来。 我给他找了一些文档&#xff0c;顺便着呢&#xff0c;反正自己也写博客&#xff0c;自己也写一份吧&#x…

无需构建工具,快速上手Vue2 + ElementUI

无需构建工具&#xff0c;快速上手Vue2 ElementUI 在前端开发的世界中&#xff0c;Vue.js以其轻量级和易用性赢得了开发者的青睐。而Element UI&#xff0c;作为一个基于Vue 2.0的桌面端组件库&#xff0c;提供了丰富的界面组件&#xff0c;使得构建美观且功能丰富的应用变得…

前端JS特效第30集:jQuery焦点图插件edslider

jQuery焦点图插件edslider&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatib…

Vmware_Mysql8.0.31_安装部署

创建mysql目录&#xff0c;将资料上传到该目录 卸载MySQL依赖&#xff0c;虽然机器上没有装MySQL&#xff0c;但是这一步不可少 sudo yum remove mysql-libs 下载依赖并安装 sudo yum install libaio udo yum -y install autoconf 切换到hadoop102的root用户 su root 执…

大模型【Qwen2-7B本地部署(WEB版)】(windows)

大模型系列文章目录 Qwen2-7B本地部署&#xff08;WEB版&#xff09; 前言 大模型是截止2024年上半年最强的AI&#xff0c;Qwen2是刚出来的号称国内最强开源大模型。这是大模型系列的第一篇文章&#xff0c;旨在快速部署看看最近出来的大模型效果怎么样&#xff0c;效果ok的话…

算法学习day11

一、用最少数量的箭引爆气球() 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭&#xff0c;若有一个气球的直径的开始和结束坐标为 xstart&#xff0c;xend&#xff0c; 且满足 xstart ≤ x ≤ xend&#xff0c;则该气球会被 引爆 。 输入&#xff…

上机算法刷题暑期篇(一) —— AcWing 3692. 最长连续公共子序列(西电)

题目链接 AcWing 3692. 最长连续公共子序列 题目详情 题目解析 我们一看到题目,最长和连续子串&#xff0c;我们第一反应应该是什么?没错,就是dp,一般来说&#xff0c;子串问题常见的解法有两种&#xff1a; 双指针 dp 这道题无疑就是一道最常见的dp问题&#xff0c;而dp问…

昇思25天学习打卡营第11天 | FCN图像语义分割

昇思25天学习打卡营第11天 | FCN图像语义分割 文章目录 昇思25天学习打卡营第11天 | FCN图像语义分割FCN模型数据处理下载数据集创建训练集可视化训练集 网络构建网络结构张量操作 训练准备导入VGG-16部分预训练权重&#xff1a;损失函数模型评估指标 模型训练模型评估模型推理…

常见 Web漏洞分析与防范研究

前言&#xff1a; 在当今数字化时代&#xff0c;Web应用程序扮演着重要的角色&#xff0c;为我们提供了各种在线服务和功能。然而&#xff0c;这些应用程序往往面临着各种潜在的安全威胁&#xff0c;这些威胁可能会导致敏感信息泄露、系统瘫痪以及其他不良后果。 SQL注入漏洞 …

《昇思25天学习打卡营第16天|基于MindNLP+MusicGen生成自己的个性化音乐》

MindNLP 原理 MindNLP 是一个自然语言处理&#xff08;NLP&#xff09;框架&#xff0c;用于处理和分析文本数据。 文本预处理&#xff1a;包括去除噪声、分词、词性标注、命名实体识别等步骤&#xff0c;使文本数据格式化并准备好进行进一步分析。 特征提取&#xff1a;将文…

5 MySql

5 MySql 一、简介二、SQL语言2.1 导入外部SQL文件2.2 显示表结构2.3 与创建数据库相关的语句2.4 与表相关的语句2.5 操作表中的数据2.6 7种基本的sql查询 三、SQL的注意点3.1 与集合函数相关3.2 SQL语句的书写与执行过程 四、约束 constraint4.1 作用4.2 功能分类4.3 自增 五、…

头歌资源库(25)地图着色

一、 问题描述 任何平面区域图都可以用四种颜色着色&#xff0c;使相邻区域颜色互异。这就是四色定理。要求给定区域图&#xff0c;排出全部可能的着色方案。例如&#xff0c;区域图如下图所示&#xff1a; 要求用四种颜色着色。 则输入&#xff1a; 10 4 &#xff08;分别表示…

python-27-零基础自学python

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 统计文本单词数、 解决问题&#xff1a; gbk codec cant decode byte 0x9d in position 995: illegal multibyte sequence” 练习内容&#xff1a; 练习10-10&#xff1a;常见单词 …

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第二十六章 安装超级终端软件

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

短视频矩阵系统是什么?怎么搭建短视频矩阵系统?一文了解矩阵模式

在数字时代&#xff0c;短视频已成为信息传播的新宠&#xff0c;而短视频矩阵系统则是品牌和个人在短视频领域取得突破的重要工具。那么&#xff0c;短视频矩阵系统究竟是什么&#xff1f;如何搭建这样一个高效的系统&#xff1f;它又能够解决哪些问题呢&#xff1f;本文将为您…