创建型模式-生成器模式

生成器模式是创建型模式的一种,生成器模式主要是解决在大类创建对象初始化的复杂的问题。将一个复杂类的创建拆分成几个部分,再根据具体需求创建初始对象,而不必每次都创建所有的部分。在需要创建包含有不同内容的对象的时候,可以通过生成器类,生成器类可以创建多个,就可以生成对于的对象。

使用场景:

1、当要使用的类在生成的时候有哦多个不同的可选参数或者模块,为了避免构造函数过大可以使用生成器模式。

2、当要是的组成部分可能有不同的属性的时候可以使用生成器模式。

使用方式:

1、明确定义步骤,确保包含了所有的生成形式。

2、在基本生成器的接口中声明步骤。

代码:

int main()
{
    std::cout << "欢迎东哥来到设计模式的世界!\n";
    SCCarBuilder* builder = new SCCarSpecificBuilder();
    SCarManage* manger = new SCarManage();
    manger->setBuilder(builder);
    manger->createCarPart1();
    SCCarProduct* product = builder->m_SCCarProduct;
    cout << product->part1 << " : " << product->part2 << " : "<< product->part3 << endl;

    SCCarBuilder* builder2 = new SCCarSpecificBuilder();
    SCarManage* manger2 = new SCarManage();
    manger2->setBuilder(builder2);
    manger2->createCarPart123();
    SCCarProduct* product2 = builder2->m_SCCarProduct;
    cout << product2->part1 << " : " << product2->part2 << " : " << product2->part3 << endl;
}
#pragma once
#include <string>

using namespace std;
class SCCarProduct //需要初始化的大类
{
public:
	SCCarProduct() {};
	~SCCarProduct() {};
	string part1 = " ";
	string part2 = " ";
	string part3 = " ";
};


class SCCarBuilder { //生成器父类类
public:
	SCCarBuilder();
	~SCCarBuilder();
	virtual bool createPart1();
	virtual bool createPart2();
	virtual bool createPart3();

	SCCarProduct* m_SCCarProduct = nullptr;
};

class SCCarSpecificBuilder:public SCCarBuilder { //具体的生成器类,实现了每一部分的实现

public:
	SCCarSpecificBuilder();
	~SCCarSpecificBuilder();
	bool createPart1();
	bool createPart2();
	bool createPart3();
};

class SCarManage { //主管类,可要可不要,用于协助生成器类生成具体的复杂类

public:
	SCarManage();
	~SCarManage();

	void setBuilder(SCCarBuilder* bulider) { m_builder = bulider; };

	void createCarPart1();
	void createCarPart2();
	void createCarPart3();
	void createCarPart123();

	SCCarBuilder* m_builder = nullptr;

};
#include "ShengChengQi.h"

SCCarBuilder::SCCarBuilder()
{
}

SCCarBuilder::~SCCarBuilder()
{
}

bool SCCarBuilder::createPart1()
{
	return false;
}

bool SCCarBuilder::createPart2()
{
	return false;
}

bool SCCarBuilder::createPart3()
{
	return false;
}

SCCarSpecificBuilder::SCCarSpecificBuilder()
{
	m_SCCarProduct = new SCCarProduct();
}

SCCarSpecificBuilder::~SCCarSpecificBuilder()
{
}

bool SCCarSpecificBuilder::createPart1()
{
	this->m_SCCarProduct->part1 = "高端模块:黄金外壳,碳纤维轮胎";
	return true;
}

bool SCCarSpecificBuilder::createPart2()
{
	this->m_SCCarProduct->part2 = "中端模块:精装外壳,橡胶轮胎";
	return true;
}

bool SCCarSpecificBuilder::createPart3()
{
	this->m_SCCarProduct->part3 = "低端模块:普通外壳,塑料轮胎";
	return true;
}

SCarManage::SCarManage()
{
}

SCarManage::~SCarManage()
{
}

void SCarManage::createCarPart1()
{
	m_builder->createPart1();
}

void SCarManage::createCarPart2()
{
	m_builder->createPart2();
}

void SCarManage::createCarPart3()
{
	m_builder->createPart3();
}

void SCarManage::createCarPart123()
{
	m_builder->createPart1();
	m_builder->createPart2();
	m_builder->createPart3();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P1617———数字转英文

题目如下 思路&#xff1a;将1~9的英文和20~90的英文用字符串数组存储&#xff0c;把下标看作对应的数字进行输出&#xff0c;遇到0或连续多个0就输出“and”&#xff0c;定义l用来看枚举到哪一位了&#xff0c;如果是单独输入一个“0”&#xff0c;则直接输出zero然后结束。否…

UnityRenderStreaming使用记录(五)

UnityRenderStreaming不一样的错误&#xff0c;船新的版本 继续docker部署UnityRenderStreamingdockerfile一些命令出现了新的错误先解决一个报错不知道怎么解决&#xff0c;先跑个glxgears测试一下先解决MESA和glx的问题新的log&#xff0c;额新的错误尝试解决libnvidia-encod…

Unity-Mirror网络框架-从入门到精通之AdditiveScenes 示例

文章目录 前言Additive Levels和Additive ScenesAdditive Levels场景介绍Portal传送门FadeInOut特效 Additive Scenes示例介绍ZoneHandlerSceneMassage 最后 前言 在现代游戏开发中&#xff0c;网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框…

Mac-docker配置

1.配置的文件路径 cd ~/.docker (base) zhangyaweimacbookair .docker % ls buildx cli-plugins config.json contexts daemon.json desktop-build mutagen run (base) zhangyaweimacbookair .docker % cat daemon.json## 重启docker服务 sudo systemctl daemon-reload sudo…

PHP进阶-在Ubuntu上搭建LAMP环境教程

本文将为您提供一个在Ubuntu服务器上搭建LAMP&#xff08;Linux, Apache, MySQL, PHP&#xff09;环境的完整指南。通过本文&#xff0c;您将学习如何安装和配置Apache、MySQL、PHP&#xff0c;并将您的PHP项目部署到服务器上。本文适用于Ubuntu 20.04及更高版本。 一、系统更新…

Elasticsearch(看这一篇就够了)

目录&#xff1a; Elasticsearch介绍正排索引和倒排索引Elasticsearch安装安装ES服务安装服务安装kibana 索引操作创建索引查询索引库修改索引库删除索引库 Elasticsearch常用操作文档操作新增文档查询文档删除文档根据id批量查询文档查询所有文档修改文档部分字段 域的属性分词…

嵌入式技术之Linux(Ubuntu) 一

一、Linux入门 1.硬件和操作系统以及用户的关系 一个传感器&#xff0c;获得数据后&#xff0c;需要向服务器发送数据。传感器传数据给上位机。 上位机需要一个程序来接收数据&#xff0c;那么这个上位机是什么机器&#xff1f; 我们的笔记本电脑就可以当成上位机。 两个手…

【实用技能】如何使用 .NET C# 中的 Azure Key Vault 中的 PFX 证书对 PDF 文档进行签名

TX Text Control 是一款功能类似于 MS Word 的文字处理控件&#xff0c;包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理&#xff0c;网站内容发布&#xff0c;电子病历中病案模板创建、病历书写、修改历史、连续打…

oracle闪回恢复数据:(闪回查询,闪回表,闪回库,回收站恢复)

oracle的闪回查询&#xff0c;可以查询提交在表空间的闪回数据&#xff0c;并可以还原所查询的数据&#xff0c;用于恢复短时间内的delele 或者 update 误操作&#xff0c;非常方便&#xff0c;缺点是只能恢复大概几小时内的数据。 文章目录 概要闪回查询恢复数据的主要方法包括…

开放词汇检测新晋SOTA:地瓜机器人开源DOSOD实时检测算法

在计算机视觉领域&#xff0c;目标检测是一项关键技术&#xff0c;旨在识别图像或视频中感兴趣物体的位置与类别。传统的闭集检测长期占据主导地位&#xff0c;但近年来&#xff0c;开放词汇检测&#xff08;Open-Vocabulary Object Detection-OVOD 或者 Open-Set Object Detec…

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络&#xff1a; 静态配置路由动态路由协议 在本文&#xff0c;我们将学习关于静态路由的各种概念&#xff0c;例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)

城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…

计算机网络--路由器问题

一、路由器问题 1.计算下一跳 计算机网络--根据IP地址和路由表计算下一跳-CSDN博客 2.更新路由表 计算机网络--路由表的更新-CSDN博客 3.根据题目要求给出路由表 4.路由器收到某个分组&#xff0c;解释这个分组是如何被转发的 5.转发分组之路由器的选择 二、举个例子 …

通过Android Studio修改第三方jar包并重新生成jar包

最近接手了来自公司其他同事的一个Unity项目,里面有一个封装的jar包要改动一下,无奈关于这个jar包的原工程文件丢失了,于是自己动手来修改下jar包,并做下记录。 一、导入第三方jar包 1、新建项目EditJarDemo(项目名随便取) 2、新建libs文件夹,把你要修改的third.jar 复制…

33.3K 的Freqtrade:开启加密货币自动化交易之旅

“ 如何更高效、智能地进行交易成为众多投资者关注的焦点。” Freqtrade 是一款用 Python 编写的免费开源加密货币交易机器人。它就像一位不知疲倦的智能交易助手&#xff0c;能够连接到众多主流加密货币交易所&#xff0c;如 Binance、Bitmart、Bybit 等&#xff08;支…

计算机网络 (26)互联网的路由选择协议

一、路由选择协议的基本概念 路由选择协议是计算机网络中用于确定数据包在网络中传输路径的一种协议。它帮助路由器构建和维护路由表&#xff0c;以便根据目的地址将数据包转发到正确的下一跳路由器。路由选择协议分为静态路由选择协议和动态路由选择协议两大类。 二、静态路由…

【MySQL实战】Centos安装MySQL

在CentOS上安装MySQL以及进行性能分析&#xff1a;2种方式&#xff0c;第一种直接装&#xff1b;第二种用docker安装&#xff1a; 直接安装MySQL 首先&#xff0c;更新系统软件包列表&#xff1a; sudo yum update然后&#xff0c;安装MySQL服务器&#xff1a; sudo yum in…

centOS7

特殊权限 set_uid 赋予所有者身份 chmod us 文件 set_gid 赋予所有组身份 chmod gs 文件/目录 sticky_bit 防火墙 firewall-cmd 开启端口 firewall-cmd --zonepublic --add-port8080/tcp --permanent 重启防火墙 systemctl restart firewalld 查看开启的所有端口 fi…

Java后端开发单元测试

测试概览 测试是用于促进鉴定软件正确性、完整性、安全性和软件质量的过程。在开发的过程中测试是必不可少的&#xff0c;测试一般分为四个阶段&#xff1a;单元测试&#xff0c;集成测试&#xff0c;系统测试&#xff0c;验收测试&#xff1b;对于后端开发人员而言&#xff0…

LAMP搭建

LAMP搭建 引子&#xff1a;本篇文章为LAMP的搭建流程&#xff0c;其中L&#xff08;Ubuntu&#xff09;、A&#xff08;Apache&#xff09;、M&#xff08;Mysql&#xff09;、P&#xff08;PHP&#xff09;。 一、L → Ubuntu Step 1&#xff1a;在Vmware Workstation中使…