设计模式2--Abstract Factory Design Pattern In C++

news/2024/4/21 14:01:42/文章来源:https://blog.csdn.net/qq_36372352/article/details/136467709

1.AFDP(抽象工厂设计模式)

        AFDP 定义了一个抽象类来创建相关的家族对象但未指定其具体子类

2.基本原理图

3.为什么/何时使用AFDP

        1.你需要系统独立于对象的创建、组合和表示方式。

        2.显示接口而不是实现。

        3.系统需要配置多个对象系列之一

4.UML图

5.C++程序

 继承中的访问protected 最关键的特性是它允许派生类访问基类中的受保护成员。这意味着如果一个基类中的成员被声明为 protected,则任何直接或间接的派生类都可以访问这些成员。这一点与 private 成员不同,private 成员即使在派生类中也是不可访问的。

Car.cpp

#ifndef __io__
#define __io__
#include <iostream>
#endifclass Tire {
protected:std::string name;int presure;
public: Tire(std::string n, int presure):name(n), presure(presure){};std::string getName() { return name;}int getPresure() {return presure;}
};class SimpleTire:public Tire {
public:SimpleTire(): Tire("SimpleTire", 75) {}
};class LuxuryTire : public Tire {
public:LuxuryTire(): Tire("LuxuryTire", 100) {}
};class Body {
protected:std::string name;int strength;
public:Body(std::string n, int strength): name(n) , strength(strength) {}std::string getName() {return name;}int getStrenth() {return strength;}
};class SimpleBody: public Body {
public:SimpleBody(): Body("SimpleBody", 75) {}
};class LuxuryBody: public Body {
public:LuxuryBody(): Body("LuxuryBody", 100) {}
};class Car {
protected:std::string name;Tire* tire;Body* body;
public:Car(std::string n): name(n) {}void setTire(Tire* t) {tire = t;}void setBody(Body* b) {body = b;}void printDetails() {std::cout << std::endl << "car:" << name << std::endl;std::cout << "tire:" << tire->getName() << "pressure:" << tire->getPresure() << std::endl;std::cout << "Body:" << body->getName() << "strength:" << body->getStrenth() << std::endl;}
};

CarFactory.cpp

#ifndef __io__
#define __io__
#include <iostream>
#endifclass Tire {
protected:std::string name;int presure;
public: Tire(std::string n, int presure):name(n), presure(presure){};std::string getName() { return name;}int getPresure() {return presure;}
};class SimpleTire:public Tire {
public:SimpleTire(): Tire("SimpleTire", 75) {}
};class LuxuryTire : public Tire {
public:LuxuryTire(): Tire("LuxuryTire", 100) {}
};class Body {
protected:std::string name;int strength;
public:Body(std::string n, int strength): name(n) , strength(strength) {}std::string getName() {return name;}int getStrenth() {return strength;}
};class SimpleBody: public Body {
public:SimpleBody(): Body("SimpleBody", 75) {}
};class LuxuryBody: public Body {
public:LuxuryBody(): Body("LuxuryBody", 100) {}
};class Car {
protected:std::string name;Tire* tire;Body* body;
public:Car(std::string n): name(n) {}void setTire(Tire* t) {tire = t;}void setBody(Body* b) {body = b;}void printDetails() {std::cout << std::endl << "car:" << name << std::endl;std::cout << "tire:" << tire->getName() << "pressure:" << tire->getPresure() << std::endl;std::cout << "Body:" << body->getName() << "strength:" << body->getStrenth() << std::endl;}
};

client.cpp

#ifndef __io__
#define __io__
#include <iostream>
#endif#include "CarFactory.cpp"#define SIMPLE_CAR 1
// #define LUXURY_CAR 1int main() {#ifdef SIMPLE_CARCarFactory* factory = new SimpleCarFactory;#elif LUXURY_CARCarFactory* factory = new LuxuryCarFactory;#endifCar *car = factory -> buildWholeCar();car -> printDetails();return 0;
}

 github见GitHub - daichang01/factory-design-in-cplusplus

 

 

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

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

相关文章

安卓部分手机使用webview加载链接后白屏(Android低版本会出现的问题)

前言 大爷&#xff1a;小伙我这手机怎么打开你们呢这个是白屏什么都不显示。 大娘&#xff1a;小伙我这也是打开你们呢这功能&#xff0c;就是一个白屏什么也没有&#xff0c;你们呢的应用不会有病毒吧。 小伙&#xff1a;我的手机也正常&#xff1b; 同事&#xff1a;我的也正…

Docker容器化解决方案(镜像,容器的操作管理)

Docker镜像管理 搜索官方仓库镜像 docker search [rootlocalhost ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx Official build of Nginx. …

【位运算】【左右位移】Leetcode 2917. 找出数组中的 K-or 值

【位运算】【左右位移】Leetcode 2917. 找出数组中的 K-or 值 解法 位运算 ---------------&#x1f388;&#x1f388;题目链接 2917. 找出数组中的 K-or 值&#x1f388;&#x1f388;------------------- 【1】<<&#xff1a;左位移运算符 符号位不变&#xff0c;低…

网络编程的学习

思维导图 多路复用代码练习 select完成TCP并发服务器 #include<myhead.h> #define SER_IP "192.168.125.73" //服务器IP #define SER_PORT 8888 //服务器端口号int main(int argc, const char *argv[]) {//1、创建用于监听的套接字int sfd -1;s…

基于GPT-SoVITS少样本语音转换的实时交互TTS

项目地址&#xff1a;https://github.com/DLW3D/GPT-SoVITS 该项目基于 RVC-Boss/GPT-SoVITS-WebUI 前言 GPT-SoVITS-WebUI 实现了使用WebUI的简易小样本语音模拟和文本转语音所需的完整流程&#xff0c;包括数据清洗、文本标注、模型微调、文本转语音。 该项目是对 GPT-SoVI…

动态规划课堂3-----简单多状态问题(买卖股票最佳时机)

目录 引入&#xff1a; 例题1&#xff1a;按摩师&#xff08;打家劫舍I&#xff09; 例题2&#xff1a;打家劫舍II 例题3&#xff1a;删除并获得点数 例题4&#xff1a;粉刷房子 例题5&#xff1a;买卖股票的最佳时机含冷冻 结语&#xff1a; 引入&#xff1a; 相信看到…

uniapp+vue3+vites使用lime-echart问题记录

问题记录 1.vue3使用echarts,H5和微信小程序兼容问题 1.vue3使用echarts,H5和微信小程序兼容问题 问题描述&#xff0c;正常使用echarts&#xff0c;H5正常&#xff0c;小程序报错 报错信息如下 解决方案&#xff1a; 注意要点一&#xff1a;vue3需要使用esm文件 地址&#x…

在ubuntu上安装hadoop完分布式

准备工作 Xshell安装包 Xftp7安装包 虚拟机安装包 Ubuntu镜像源文件 Hadoop包 Java包 一、安装虚拟机 创建ubuntu系统 完成之后会弹出一个新的窗口 跑完之后会重启一下 按住首先用ctrlaltf3进入命令界面&#xff0c;输入root&#xff0c;密码登录管理员账号 按Esc 然后输入 …

解决/sys/kernel/debug/下没有任何文件的

问题&#xff1a; /sys/kernel/debug目录下没有任何信息 解决&#xff1a; 首先检查Debug Filesystem是否选中&#xff0c;其位置是&#xff1a; Kernel hacking -> Compile-time checks and compiler options -> Debug Filesystem 打开configs文件查看是否为y: arch/arm…

2024全国水科技大会之国际合作与新技术、新产品推介会

召集人&#xff1a;中华环保联合会水环境治理专委会 此论坛主要为筛选新技术、新产品&#xff0c;入选企业后续可参与到我会7月的国际考察中&#xff0c;可为企业推荐国际项目合作&#xff01; 一、会议背景 为积极应对“十四五”期间我国生态环境治理面临的挑战&#xff0c;加…

栈【stack】 栈的【STL】运用 【单调栈】 【单调栈】的详细解释【图文讲解】 洛谷P5788 【模板】单调栈 【单调队列】

文章目录 栈的定义栈的STL运用 单调栈 & 单调队列单调栈的详细解释【图文讲解】例题&#xff1a;洛谷P5788 【模板】单调栈code↓洛谷P5788 【模板】单调栈 AC 栈的定义 栈的修改与访问是按照后进先出的原则进行的 栈通常被称为是后进先出&#xff08;last in first out&…

【深度学习笔记】优化算法——随机梯度下降

随机梯度下降 在前面的章节中&#xff0c;我们一直在训练过程中使用随机梯度下降&#xff0c;但没有解释它为什么起作用。为了澄清这一点&#xff0c;我们刚在 :numref:sec_gd中描述了梯度下降的基本原则。本节继续更详细地说明随机梯度下降&#xff08;stochastic gradient d…

2024年【安全员-C证】找解析及安全员-C证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证找解析是安全生产模拟考试一点通总题库中生成的一套安全员-C证模拟考试&#xff0c;安全生产模拟考试一点通上安全员-C证作业手机同步练习。2024年【安全员-C证】找解析及安全员-C证模拟考试 1、【多选题】…

【解决】虚幻导入FBX模型不是一个整体

问题&#xff1a; 现在有一个汽车的fbx模型&#xff0c;导入虚幻引擎&#xff0c;导入后变成了很多汽车零件模型。 解决&#xff1a; 把“合并网格体”勾选上&#xff0c;解决问题。

STM32各外设初始化步骤

1、GPIO初始化步骤 1、使能GPIO时钟 2、初始化GPIO的输入/输出模式 3、设置GPIO的输出值或获取GPIO的输入值 GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin…

JavaScript基础Ⅱ

目录 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数 第3章 JS事件 14-事件的绑定方式 常用事件(了解) 15-常用事件 第4章 JS内置对象(掌握) 16-数组 17-日期 18-数学运算 19-数字 20-全局函数 第2章 JavaScript基础语法(掌握) 11-JS代码调试 12-JS函数…

Kosmos-1: 通用接口架构下的多模态大语言模型

Kosmos-1: 通用接口架构下的多模态大语言模型 FesianXu 20230513 at Baidu Search Team 前言 在大规模语言模型&#xff08;Large Language Model, LLM&#xff09;看似要带来新一番人工智能变革浪潮之际&#xff0c;越来越多尝试以LLM作为通用接口去融入各种任务的工作&#…

Git实战(1)

一, git log 查看提交日志情况 根据 commitId进行版本回退 git reset --hard commitId(commitId可以是一部分,不用完整的ID) 只输出一行信息: git log --pretty=oneline 快速回退: git reset --hard HEAD^ 回退到上一个版本 git reset --hard HEAD^^ 回退到上上个版本 如果…

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

防火墙:网络防御的第一道防线

目录 引言 一、安全技术与防火墙 &#xff08;一&#xff09;安全技术 &#xff08;二&#xff09;防火墙的主要功能与分类 1.防火墙的主要功能 2.防火墙的分类 二、Linux防火墙的基本认识 &#xff08;一&#xff09;Netfilter &#xff08;二&#xff09;防火墙工具…