【15】c++设计模式——>抽象工厂模式

在海贼世界中,位于水之都的弗兰奇一家是由铁人弗兰奇所领导的以拆船为职业的家族,当然了他们的逆向工程做的也很好,会拆船必然会造船。船是海贼们出海所必备的海上交通工具,它由很多的零件组成,从宏观上看它有这么几个组成部分:船体动力系统武器
根据这个表,在造船的时候需要根据不同的型号选择相应的零部件,在设计程序的时候还需要保证遵循开放-封闭原则,即添加了新型号之后不需要修改原有代码,而是添加新的代码。
在这里插入图片描述
假如我是一个客户,我在买船时我会根据自己手头资金来选择不同价位的型号,例如基础型、标准型、旗舰型,不同的型号下的船的组成采用不同的材料。
作为卖家,为了提高生产效率,我需要拆分出来不同的材料,最终根据型号打包在一起;比如对于船体来说,我拆分出来有木头,钢铁,合金,我在生产基础型号时,我就将木头,手动,枪打包在一起。
对于船体,动力,武器这三个组成部分来说,我们需要一个基类,然后在子类中去扩展;

船体代码

// 船体
class ShipBody
{
public:virtual string getShipBody() = 0;virtual ~ShipBody() {}
};class WoodBody : public ShipBody
{
public:string getShipBody() override{return string("用<木材>制作轮船船体...");}
};class IronBody : public ShipBody
{
public:string getShipBody() override{return string("用<钢铁>制作轮船船体...");}
};class MetalBody : public ShipBody
{
public:string getShipBody() override{return string("用<合金>制作轮船船体...");}
};

动力和武器

// 动力
class Engine
{
public:virtual string getEngine() = 0;virtual ~Engine() {}
};class Human : public Engine
{
public:string getEngine() override{return string("使用<人力驱动>...");}
};class Diesel : public Engine
{
public:string getEngine() override{return string("使用<内燃机驱动>...");}
};class Nuclear : public Engine
{
public:string getEngine() override{return string("使用<核能驱动>...");}
};// 武器
class Weapon
{
public:virtual string getWeapon() = 0;virtual ~Weapon() {}
};class Gun : public Weapon
{
public:string getWeapon() override{return string("配备的武器是<枪>");}
};class Cannon : public Weapon
{
public:string getWeapon() override{return string("配备的武器是<自动机关炮>");}
};class Laser : public Weapon
{
public:string getWeapon() override{return string("配备的武器是<激光>");}
};

组装

// 轮船类
class Ship
{
public:Ship(ShipBody* body, Weapon* weapon, Engine* engine) :m_body(body), m_weapon(weapon), m_engine(engine) {}string getProperty(){string info = m_body->getShipBody() + m_weapon->getWeapon() + m_engine->getEngine();return info;}~Ship() {delete m_body;delete m_engine;delete m_weapon;}
private:ShipBody* m_body = nullptr;Weapon* m_weapon = nullptr;Engine* m_engine = nullptr;
};

整体代码

#include <iostream>
using namespace std;/**********************************_我需要定义三个船体结构的基类,以及各自的子类_**************************************/
/***********************_船体_**********************/
class shipBody
{
public:virtual ~shipBody() {} //虚析构是为了释放父类指针时能把子类对也释放掉virtual string getProperty() = 0;
};
class woodBody :public shipBody
{
public:woodBody() {}~woodBody() {}string getProperty(){return string("木质船身..");}
};
class ironBody :public shipBody
{
public:ironBody() {}~ironBody() {}string getProperty(){return string("钢铁船身..");}
};
class alloyBody :public shipBody
{
public:alloyBody() {}~alloyBody() {}string getProperty(){return string("合金船身..");}
};
/*******************************************************/
/***********************_动力_**********************/
class shipPower
{
public:virtual ~shipPower() {} //虚析构是为了释放父类指针时能把子类对也释放掉virtual string getProperty() = 0;
};
class humanPower :public shipPower
{
public:humanPower() {}~humanPower() {}string getProperty(){return string("手动驱动..");}
};
class nuclearPower :public shipPower
{
public:nuclearPower() {}~nuclearPower() {}string getProperty(){return string("核能驱动");}
};
class  steamPower :public shipPower
{
public:steamPower() {}~steamPower() {}string getProperty(){return string("蒸汽驱动");}
};
/*******************************************************/
/***********************_武器_**********************/
class shipWeapon
{
public:virtual ~shipWeapon() {} //虚析构是为了释放父类指针时能把子类对也释放掉virtual string getProperty() = 0;
};
class gunWeapon :public shipWeapon
{
public:gunWeapon() {}~gunWeapon() {}string getProperty(){return string("枪支武器..");}
};
class artilleryWeapon :public shipWeapon
{
public:artilleryWeapon() {}~artilleryWeapon() {}string getProperty(){return string("火炮武器");}
};
class  leaserWeapon :public shipWeapon
{
public:leaserWeapon() {}~leaserWeapon() {}string getProperty(){return string("激光武器");}
};
/*******************************************************/
/**********************************************************************************************************************/
/*****************************************************__船类__*********************************************************/
class ship
{
public:ship(shipBody* body,shipPower* power,shipWeapon* weapon):m_body(body),m_power(power),m_weapon(weapon){}string getProperty(){string info = m_body->getProperty() + m_power->getProperty() + m_weapon->getProperty();return info;}~ship(){delete m_body;delete m_power;delete m_weapon;}
private:shipBody* m_body = nullptr;shipPower* m_power = nullptr;shipWeapon* m_weapon = nullptr;
};
/***********************************************************************************************************************/
/*****************************************************__工厂类__**********************************************************/
class AbstractShipFactory
{
public:virtual ship* createShip() = 0;virtual ~AbstractShipFactory() {}
};class basicShip :public AbstractShipFactory
{
public:ship* createShip() override{ship* shipModel = new ship(new woodBody,new humanPower,new gunWeapon);cout << "<基础型>战船生成完毕,可以下水了...." << endl;return shipModel;}
};class standardShip :public AbstractShipFactory
{
public:ship* createShip() override{ship* shipModel = new ship(new ironBody, new steamPower, new artilleryWeapon);cout << "<标准型>战船生成完毕,可以下水了...." << endl;return shipModel;}
};class ultimateShip :public AbstractShipFactory
{
public:ship* createShip() override{ship* shipModel = new ship(new alloyBody, new nuclearPower, new leaserWeapon);cout << "<旗舰版>战船生成完毕,可以下水了...." << endl;return shipModel;}
};
/*************************************************************************************************************************/
int main()
{//造一艘旗舰版战船AbstractShipFactory* ultimateS = new ultimateShip;ship* s1 = ultimateS->createShip();cout << s1->getProperty() << endl;delete ultimateS;delete s1;AbstractShipFactory* basicS = new basicShip;ship* s2 = basicS->createShip();cout << s2->getProperty() << endl;;delete basicS;delete s2;//造一艘旗舰版战船AbstractShipFactory* standardS = new standardShip;ship* s3 = standardS->createShip();cout << s3->getProperty() <<endl;delete standardS;delete s3;return 0;
}

在这里插入图片描述

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

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

相关文章

智慧财务管家,记录分析收支明细,轻松掌握财务情况并随时打印保存!

在日常的财务管理中&#xff0c;准确记录和分析收支明细是掌握财务情况、制定科学预算和实现财务目标的重要一环。然而&#xff0c;繁琐的手动记录和分析过程常常让我们感到头痛。现在&#xff0c;让我们向您推荐一款智慧财务管家&#xff0c;帮助您轻松记录和分析收支明细&…

仿函数的学习

仿函数 也叫 函数对象 仿函数是什么东西&#xff1f; 当你第一眼看到下面的代码的时候&#xff0c;你会觉得它是一个函数的调用&#xff1a; bool result less(a, b);但是我如果告诉你&#xff0c;less 是一个我自定义的一个类的对象呢&#xff1f; class Less { public:bo…

Interference Signal Recognition Based on Multi-Modal Deep Learning

系统结构 基于决策的融合实际上是用损失函数监督融合模型 其中 N N N是训练样本的数量 体会 作者未解释公式4的 t i t_i ti​的含义且不公布代码

elment以及elementPlus选中组件出现黑框问题解决!!

目录 问题&#xff1a; 图示&#xff1a; 解决方案&#xff1a; 问题&#xff1a; 使用elementPlus的按钮组件&#xff0c;点击按钮后会出现黑框&#xff0c;除非点击其他地方才能取消掉&#xff08;之前使用elment-ui其它组件时也出现过&#xff09; 图示&#xff1a; 解决方案…

Day-07 修改 Nginx 配置文件

至此&#xff1a; 简单的 Docker 安装 Nginx并启动算是成功了! ps: 如何修改 Nginx的配置、更改nginx 的资源文件&#xff1f; eg&#xff1a; 1、可以将容器中的目录和本机目录做映射。 2、达到修改本机目录文件就影响到容器中的文件。 1.本机创建实例文件夹 新建目录&#x…

【机器学习-黑马程序员】人工智能、机器学习概述

文章目录 前言一、人工智能概述二、什么是机器学习二、机器学习算法分类三、机器学习开发流程 前言 本专栏文章为观看黑马程序员《python机器学习》所做笔记&#xff0c;课程地址在这。如有侵权&#xff0c;立即删除。 一、人工智能概述 机器学习和人工智能、深度学习的关系 机…

即时通讯软件

通信协议 发送消息可以是个struct 客户端分两个线程&#xff1a;读取服务器&#xff0c;给服务器发&#xff08;否则会导致阻塞&#xff09; read和write的第二个参数类型是&#xff1a;void *buf——————不仅仅是一个字符串&#xff0c;也可以是一个结构体等等&#xf…

获取沪深300的所有个股列表

脚本&#xff1a; import requests from bs4 import BeautifulSoupurl "https://q.stock.sohu.com/cn/bk_4444.shtml" response requests.get(url) soup BeautifulSoup(response.text, "html.parser")# 找到包含class为e1的元素 elements soup.find_a…

NodeMCU ESP8266硬件开发板的熟悉

文章目录 硬件开发环境的熟悉基础介绍什么是 ESP8266 NodeMCU&#xff1f;NodeMCU芯片ESP12-E 模组开发板 ESP8266 版本引脚图Power GND I2CGPIOADCUARTSPIPWMControl 总结 硬件开发环境的熟悉 基础介绍 什么是 ESP8266 NodeMCU&#xff1f; ESP8266是乐鑫开发的一款低成本 …

阿里云服务器搭建网站(图文新手教程)

使用阿里云服务器快速搭建网站教程&#xff0c;先为云服务器安装宝塔面板&#xff0c;然后在宝塔面板上新建站点&#xff0c;阿里云服务器网以搭建WordPress网站博客为例&#xff0c;来详细说下从阿里云服务器CPU内存配置选择、Web环境、域名解析到网站上线全流程&#xff1a; …

TempleteMethod

TempleteMethod 动机 在软件构建过程中&#xff0c;对于某一项任务&#xff0c;它常常有稳定的整体操作结构&#xff0c;但各个子步骤却有很多改变的需求&#xff0c;或者由于固有的原因 &#xff08;比如框架与应用之间的关系&#xff09;而无法和任务的整体结构同时实现。如…

【进程管理】初识进程

一.何为进程 教材一般会给出这样的答案: 运行起来的程序 或者 内存中的程序 这样说太抽象了&#xff0c;那我问程序和进程有什么区别呢&#xff1f;诶&#xff1f;这我知道&#xff0c;书上说&#xff0c;动态的叫进程&#xff0c;静态的叫程序。那么静态和动态又是什么意思…

坦克世界WOT知识图谱三部曲之爬虫篇

文章目录 关于坦克世界1. 爬虫任务2. 获取坦克列表3. 获取坦克具体信息结束语 关于坦克世界 《坦克世界》(World of Tanks, WOT)是我在本科期间玩过的一款战争网游&#xff0c;由Wargaming公司研发。2010年10月30日在俄罗斯首发&#xff0c;2011年4月12日在北美和欧洲推出&…

SQL:增、删、改、查 基本语句 Navicat建库(用法 + 例子)

文章目录 新建数据库新建表 增、删、改、查select 查找insert 添加delete 删除update 修改where 扩展 < > < > ! <> 比较运算符and or 逻辑运算符between...and... 介于..和..之间in 包含like 模糊查询is null 为空的 查询扩展order by 排序limit start coun…

【计算机组成原理】考研真题攻克与重点知识点剖析 - 第 2 篇:数据的表示和运算

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

mysql日期月份相关函数

从给定日期提取最后一天&#xff1a; 要知道2017年12月的最后日期&#xff0c;可以按以下方式执行LAST_DAY()函数&#xff1a;用法:输出&#xff1a; 2017-12-31 从给定的日期时间中提取最后一天&#xff1a; 要使用日期时间格式了解月份的最后日期&#xff0c;可以按以下方式…

【Jmeter】性能测试脚本开发——性能测试环境准备、Jmeter脚本编写和执行

文章目录 一、常用的Jmeter元件二、性能测试环境准备三、编写Jmeter脚本四、执行测试脚本 一、常用的Jmeter元件 取样器-HTTP请求 作用&#xff1a;发送HTTP请求配置原件-HTTP请求默认值 作用&#xff1a;设置HTTP请求的默认参数配置原件-用户定义的变量 作用&#xff1a;定义…

分类预测 | Matlab实现BES-ELM秃鹰搜索算法优化极限学习机分类预测

分类预测 | Matlab实现BES-ELM秃鹰搜索算法优化极限学习机分类预测 目录 分类预测 | Matlab实现BES-ELM秃鹰搜索算法优化极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 Matlab实现BES-ELM秃鹰搜索算法优化极限学习机分类预测&#xff08;完整源码和数…

探秘前后端开发世界:猫头虎带你穿梭编程的繁忙街区,解锁全栈之路

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

算法题:盛最多水的容器

这个题目乍一看就是双指针&#xff0c;没想到官方解答也是双指针&#xff0c;我在官方的基础上优化了一下下&#xff0c;左右两边各一个指针&#xff0c;每次移动短的那一头的时候&#xff0c;不是移动一格&#xff0c;而是找到比短的那一头要长一点的&#xff0c;再进行比较。…