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;未来将逐步拓展至全品类&…

递推(C语言)

文章目录 1.斐波那契数列2.太波那契数列3.二维递推问题4.实战4.1 力扣509 斐波那契数4.2 力扣70 爬楼梯4.3 力扣119 杨辉三角|| 递推最通俗的理解就是数列&#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;无线局域网逐步进入市场…

el-dialog弹框里面的组件第二次打开create不生效

问题: el-dialog弹框嵌套了一个组件,第二次打开create不生效. 原因:display&#xff1a;none和display&#xff1a;block来控制显示隐藏的&#xff0c;dom元素不会被删除&#xff0c;所以dialog弹框里面的内容只会初始化的时候创建dom元素渲染页面&#xff0c;如果里面有组件且…

浅谈ES6

ES6&#xff1a;即 ECMAScript 6&#xff0c;是 JavaScript 语言的重要版本更新&#xff0c;引入了众多新的语法和特性&#xff0c;如箭头函数、模板字符串、类、模块等&#xff0c;使 JavaScript 编程更加简洁和强大。 ESM&#xff1a;全称 ECMAScript Modules&#xff0c;是 …

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

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

归并树的带权路径长度

归并树&#xff08;又称霍夫曼树&#xff0c;Huffman Tree&#xff09;是一种用于数据压缩的树形结构&#xff0c;通过构建具有最小带权路径长度的树来实现高效编码。在归并树中&#xff0c;带权路径长度&#xff08;Weighted Path Length&#xff0c;WPL&#xff09;是衡量树的…

破解Memcached缓存数据不均:优化策略与实践指南

破解Memcached缓存数据不均&#xff1a;优化策略与实践指南 Memcached作为广泛使用的高性能分布式内存缓存系统&#xff0c;在处理大规模数据缓存时&#xff0c;可能会遇到缓存数据分布不均的问题。这不仅影响缓存效率&#xff0c;还可能导致系统性能瓶颈。本文将深入探讨Memc…

无需构建工具,快速上手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 执…

C-MAPSS数据集-RUL剩余寿命预测

RUL剩余寿命预测 1. C-MAPSS数据集简介1.1 数据特点1.2 数据划分2. Pytorch 寿命预测简单测试2.1 数据可视化2.2 训练数据和测试数据结构分析2.3 训练数据的参数(工况参数+传感监测参数)2.4 剩余寿命预测问题2.5 简单预测测试2.6 方法局限性总结参考资料1. C-MAPSS数据集简介…

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

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

Maven 项目编译提示 unparseable pom 的解决方法

【问题描述】 手动下载了个项Java Web 项目&#xff0c;导入在 eclipse 开发工具里。然后一股脑地右键 “maven clean” 。然后发现操作 maven 什么东西都提示 "unparseable POM"字眼。结果就是根本更新不了本地的 maven 仓库。 【答案】 找到 eclipse 的 “windo…

算法学习day11

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

Xcode持续集成之道:自动化构建与部署的精粹

标题&#xff1a;Xcode持续集成之道&#xff1a;自动化构建与部署的精粹 在快节奏的软件开发中&#xff0c;持续集成&#xff08;Continuous Integration, CI&#xff09;是提升开发效率和软件质量的关键实践。Xcode作为苹果生态中的核心开发工具&#xff0c;提供了与多种持续…

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

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