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

news2024/11/19 15:16:17

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

船体代码

// 船体
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.coloradmin.cn/o/1062462.html

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

相关文章

数据结构--》探索数据结构中的字符串结构与算法

本文将带你深入了解串的基本概念、表示方法以及串操作的常见算法。通过深入理解串的相关概念和操作&#xff0c;我们将能够更好地应用它们来解决算法问题。 无论你是初学者还是进阶者&#xff0c;本文将为你提供简单易懂、实用可行的知识点&#xff0c;帮助你更好地掌握串在数据…

【云笔记篇】Microsoft OneNote笔记插件推荐OneMore

【云笔记篇】Microsoft OneNote笔记插件推荐OneMore OneMore插件是一款非常强大&#xff0c;多达一百多个扩展功能的OneNote笔记插件&#xff0c;而且免费开源&#xff0c;不断更新的优秀插件—【蘇小沐】 1、实验 【OneMore官网&#xff1a;OneMore - a OneNote add-in (on…

使用idea 中的rest 将 git 合并部分分支代码到主分支

需求&#xff1a;当要将dev的分支中的部分代码合并到test分支时&#xff0c;又不想把dev的全部代码合并到test分支 例如dev分支已经提交了 demo1到4&#xff0c;到想把demo1-3的代码合并到test分支&#xff0c;demo4暂时不合并 可以使用idea的reset 功能满足以上需求 1首先切…

Activity之间数据回传【Android、activity回传、结合实例】

任务要求 在Android应用中&#xff0c;有时需要从一个Activity向另一个Activity传递数据&#xff0c;并在第二个Activity处理后将结果传递回第一个Activity。 这种情况下&#xff0c;我们可以使用startActivityForResult()和onActivityResult()方法来实现数据回传。 实现步骤…

Day-07 修改 Nginx 配置文件

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

图像拼接后丢失数据,转tiff报错rasterfile failed: an unknown

图像拼接后丢失数据 不仅是数据丢失了&#xff0c;还有个未知原因报错 部分数据存在值不存在的情况 原因 处理遥感数据很容易&#xff0c;磁盘爆满了 解决方案 清理一些无用数据&#xff0c;准备买个2T的外接硬盘用着了。 然后重新做处理

获取沪深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…

计算机毕设 大数据房价预测分析与可视

文章目录 0 前言1 课题背景2 导入相关的数据 3 观察各项主要特征与房屋售价的关系4 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟…

战火使命攻略,高级回响怎么出现

《战火使命》中&#xff0c;高级回响材料是每个玩家追求的梦想&#xff0c;因为它们不仅能够提升角色的实力&#xff0c;还能让你在战场上独具风采。本战火使命攻略将详细介绍三种获取高级回响的方法&#xff0c;助你在游戏中更加强大&#xff01; 关注【娱乐天梯】&#xff0c…

数据结构-图-基础知识

图 图的基本概念图的概念顶点和边有向图和无向图完全图有向完全图无向完全图 邻接顶点顶点的度路径和路径长度简单路径和回路子图生成树 连通图强连通图 图的存储结构邻接矩阵邻接表 图的遍历BFSDFS 图的基本概念 图的概念 &#x1f680;图是由顶点集合及顶点间关系组成的一种…

O(根号n/ln(根号n))时间复杂度内求n的所有因子

O&#xff08;&#xff09;复杂度内求n的所有因子&#xff0c;在2e9数量级比O&#xff08;&#xff09;快10倍左右 先用范围内的质数除n&#xff0c;求出n的分解质因数形式&#xff0c;然后爆搜求出n的所有因子&#xff0c; n范围内的质数大约有个&#xff0c;所以是这个时间…

Spring Framework 黑马程序员-学习笔记

5.spring-核心概念 IoC &#xff1a;控制反转 使用对象时&#xff08;如在service类中调用Dao层的对象&#xff0c;以便使用Dao类中的方法&#xff09;&#xff0c;本来是依靠new一个Dao层的对象来实现&#xff0c;而实现了Ioc思想的Spring为了解耦&#xff0c;将此过程改为&…

Play Beyond:Sui让优秀的游戏变得更好

自问世以来&#xff0c;视频游戏就紧随着文化产业发展。从Pong和Space Invaders的时代到Animal Crossing和Among Us&#xff0c;伟大的游戏总有能力吸引玩家&#xff0c;并推动娱乐产业发展。根据Grand View Research的数据&#xff0c;全球视频游戏市场在2022年估计为2170.6亿…

fastadmin插件 shopro 商城支付配置

1、 2、 注意上图中有添加支付方式链接&#xff0c;可以点击添加&#xff0c;这里添加后立即生效

zkVM设计性能分析

1. 引言 本文主要参考&#xff1a; 2023年9月ZKSummit10 Wei Dai 1k(x) & Terry Chung 1k(x)分享视频 ZK10: Analysis of zkVM Designs - Wei Dai & Terry Chung 当前有各种zkVM&#xff0c;其设计思想各有不同&#xff0c;且各有取舍&#xff0c;本文重点对现有各z…

[C语言】(指针解决)输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组

代码 下面是使用指针解决的代码示例&#xff1a; #include <stdio.h>void swap(int *a, int *b) {int temp *a;*a *b;*b temp; }int main() {int arr[100], n, max_index 0, min_index 0;printf("Enter the size of the array: ");scanf("%d"…

Maven(项目构建管理工具)

为什么要使用Maven&#xff1f; 传统项目管理状态分析&#xff1a; ①jar包不统一&#xff0c;jar包不兼容&#xff1b; ②工程升级维护过程操作繁琐&#xff1b; ........... Maven(JAVA书写)&#xff1a;管理jar包以及jar之间的依赖关系&#xff0c;完成项目编译&#xff0c;…

【算法】排序——归并排序和计数排序

主页点击直达&#xff1a;个人主页 我的小仓库&#xff1a;代码仓库 C语言偷着笑&#xff1a;C语言专栏 数据结构挨打小记&#xff1a;初阶数据结构专栏 Linux被操作记&#xff1a;Linux专栏 LeetCode刷题掉发记&#xff1a;LeetCode刷题 算法头疼记&#xff1a;算法专栏…

回归预测|GWO-BPNN-Adaboost算法原理及其实现(Matlab)

在上一篇文章中介绍了BPNN-Adaboost算法的原理及其实现&#xff0c;Adaboost算法可以将多个BPNN作为弱分类器进行训练&#xff0c;使其相互补充&#xff0c;集成为具有较强鲁棒性的强分类器。但由于BPNN对于初始权值和阈值的选取具有随机性&#xff0c;这将导致模型精度的不定性…