C++ 设计模式——简单工厂模式

简单工厂模式

      • 简单工厂模式
        • 主要组成部分
        • 代码实现
        • 简单工厂模式模式的 UML 图
        • 简单工厂模式 UML 图解析
        • 优点和缺点
        • 适用场景

简单工厂模式

简单工厂模式是一种创建型设计模式,通过一个工厂类来负责对象的实例。这种模式将对象创建的细节封装在工厂类中,客户端无需知道具体的创建过程,只需通过工厂类获取对象实例即可。

引入“简单工厂”设计模式的定义(实现意图):定义一个工厂类,该类的成员函数可以根据不同的参数创建并返回不同的类对象,被创建的对象所属的类一般都具有相同的父类。调用者无需关心创建对象的细节。

主要组成部分
  • 工厂类(Factory):负责创建对象的类。它包含一个静态方法,根据传入的参数决定创建哪种具体产品。
  • 产品接口(Product):定义了产品的基本行为和属性,所有具体产品类都需要实现这个接口。
  • 具体产品类(ConcreteProduct):实现了产品接口的具体类,表示工厂可以创建的具体对象。
代码实现

以下代码,主要用简单工厂模式创建不同类型的怪物对象:

#include <iostream>
#include <string>using namespace std;//怪物父类
class Monster
{
public://构造函数Monster(int life, int magic, int attack) :m_life(life), m_magic(magic), m_attack(attack) {}virtual ~Monster() {} //做父类时析构函数应该为虚函数protected: //可能被子类访问的成员,用protected修饰//怪物属性int m_life;    //生命值int m_magic;   //魔法值int m_attack;  //攻击力
};//亡灵类怪物
class M_Undead :public Monster
{
public://构造函数M_Undead(int life, int magic, int attack) :Monster(life, magic, attack){cout << "一只亡灵类怪物来到了这个世界" << endl;}//其他代码略....
};//元素类怪物
class M_Element :public Monster
{
public://构造函数M_Element(int life, int magic, int attack) :Monster(life, magic, attack){cout << "一只元素类怪物来到了这个世界" << endl;}//其他代码略....
};//机械类怪物
class M_Mechanic :public Monster
{
public://构造函数M_Mechanic(int life, int magic, int attack) :Monster(life, magic, attack){cout << "一只机械类怪物来到了这个世界" << endl;}//其他代码略....
};//--------------------------------
// 简单工厂模式
// 怪物工厂类
class MonsterFactory
{
public:Monster* createMonster(string strmontype){Monster* prtnobj = nullptr;if (strmontype == "udd")  //udd代表要创建亡灵类怪物{prtnobj = new M_Undead(300, 50, 80);}else if (strmontype == "elm") //ele代表要创建元素类怪物{prtnobj = new M_Element(200, 80, 100);}else if (strmontype == "mec") //mec代表要创建机械类怪物{prtnobj = new M_Mechanic(400, 0, 110);}return prtnobj;}
};// 使用示例
int main() 
{MonsterFactory facobj;Monster* undead = facobj.createMonster("udd"); //产生了一只亡灵类怪物,当然这里必须知道"udd"代表的是创建亡灵类怪物Monster* element = facobj.createMonster("elm"); //产生了一只元素类怪物Monster* mechanic = facobj.createMonster("mec"); //产生了一只机械类怪物// 释放内存delete undead;delete element;delete mechanic;return 0;
}
简单工厂模式模式的 UML 图

在这里插入图片描述

简单工厂模式 UML 图解析
  • 类关系
    • 类之间的父子关系通过实线箭头表示。子类(如 M_UndeadM_ElementM_Mechanic)与父类 Monster 之间有一条实线箭头,指向父类。
    • MonsterFactory 类与具体怪物类(如 M_UndeadM_ElementM_Mechanic)之间存在虚线箭头,表示依赖关系。虚线箭头指向被实例化的类,表明 MonsterFactory 负责创建这些怪物对象。
  • 稳定与变化
    • 创建怪物的代码只需与 MonsterFactory 类交互,因此调用 createMonster 成员函数的代码是稳定的。
    • 但若要增加新类型的怪物,就需要修改 MonsterFactory 类中的 createMonster 函数,这部分代码是变化的。
  • 信息隐藏
    • 如果 MonsterFactory 由第三方开发,开发者不希望暴露具体怪物类(如 M_UndeadM_ElementM_Mechanic)的细节。通过提供 createMonster 接口,开发者可以创建不同类型的怪物,从而实现具体实现的隐藏,并确保创建怪物的代码与具体类解耦,避免模块间的相互影响。
优点和缺点

优点

  • 简化客户端代码:客户端只需通过工厂类获取对象,而无需了解对象的具体创建过程。
  • 集中管理对象创建:所有对象的创建逻辑集中在工厂类中,便于维护和管理。
  • 易于扩展:新增产品时,只需在工厂类中添加相应的创建逻辑,客户端代码无需修改。

缺点

  • 违反开闭原则:增加新产品需要修改工厂类的代码,导致工厂类可能变得臃肿。
  • 赖于字符串参数:客户端需要了解产品类型的字符串标识,可能导致错误和不易维护。
  • 不适合产品种类过多的情况:如果产品种类增多,工厂类会变得复杂且难以管理。
适用场景
  • 产品具有相似结构:当需要创建的对象具有相似的结构或特性,且种类较少时。
  • 客户端不关心创建过程:客户端希望通过简单的接口获取对象实例,而不关心其创建细节。
  • 快速原型开发:在项目初期,快速实现功能时,可以使用简单工厂模式减少复杂性。
  • 动态创建对象:需要根据不同条件动态创建对象的情况,适合使用简单工厂模式。

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

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

相关文章

CAN通讯接口 8路电压电流模拟量采集模块DAM-C3054P

简介&#xff1a; DAM-C3054P为8路差分模拟量采集模块&#xff0c;16位AD&#xff0c;CAN通讯接口&#xff0c;支持CAN2.0A标准帧格式&#xff0c;支持CAN-OPEN协议。配备良好的人机交互界面&#xff0c;使用方便&#xff0c;性能稳定。 产品图片及尺寸&#xff1a; 指标参数…

2024网络安全学习路线,最全保姆级教程,学完直接拿捏!

关键词&#xff1a; 网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 前排提示&#xff1a;文末有CSDN独家网络安全资料包&#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有…

机器学习|什么是梯度下降(小白向)|探寻最优解之路

文章目录 前言一、什么是梯度下降&#xff1f;二、梯度下降法一般步骤1.确定一个小目标——预测函数2.找到差距——代价函数3.明确搜索方向——梯度计算4.一步要走多远&#xff1f;——学习率 三、梯度下降的分类批量梯度下降&#xff08;Batch Gradient Descent&#xff09;随…

Java语言程序设计基础篇_编程练习题***16.31(游戏:四子连)

目录 题目&#xff1a;***16.31&#xff08;游戏&#xff1a;四子连&#xff09; 习题思路 代码示例 结果展示 题目&#xff1a;***16.31&#xff08;游戏&#xff1a;四子连&#xff09; 编程练习题8.20让两个玩家在控制台上可以玩四子连的游戏。为这个程序重写一个GUI版本…

Catf1ag CTF Web(八)

前言 Catf1agCTF 是一个面向所有CTF&#xff08;Capture The Flag&#xff09;爱好者的综合训练平台&#xff0c;尤其适合新手学习和提升技能 。该平台由catf1ag团队打造&#xff0c;拥有超过200个原创题目&#xff0c;题目设计注重知识点的掌握&#xff0c;旨在帮助新手掌握C…

数据结构----队列

1 什么是队列&#xff1f; 只允许在两端进行插入和删除操作的线性表&#xff0c;在队尾插入&#xff0c;在队头删除 插入的一端&#xff0c;被称为"队尾"&#xff0c;删除的一端被称为"队头" 在队列操作过程中&#xff0c;为了提高效率&#xff0…

开源通用验证码识别OCR —— DdddOcr 源码赏析(一)

文章目录 [toc] 前言DdddOcr环境准备安装DdddOcr使用示例 源码分析实例化DdddOcr实例化过程 分类识别分类识别过程 未完待续 前言 DdddOcr 源码赏析 DdddOcr DdddOcr是开源的通用验证码识别OCR 官方传送门 环境准备 安装DdddOcr pip install ddddocr使用示例 示例图片如…

Java语言程序设计——篇十五(3)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

450nm 高功率蓝光激光模组使用多长时间需要更换

450nm蓝光激光模组以其独特的波长特性和高功率输出&#xff0c;成为了市场上备受瞩目的产品。然而&#xff0c;对于用户而言&#xff0c;了解这类高功率激光模组的使用寿命及何时需要更换&#xff0c;是确保工作效率和设备安全性的重要环节。本文将带大家了解450nm 高功率蓝光激…

使用钉群发送告警通知

创建钉群&#xff0c;添加机器人 创建群 添加机器人并设置信息 需要注意的是设置“安全设置”时如果使用自定义关键词方式&#xff0c;那设置的内容必须要包含告警消息的内容 代码 模拟http请求发送通知 /*** param content 消息内容* param webhook 设置告警通知的群中机器…

6款局域网管理软件优选|企业网络安全管理必备!

局域网管理软件在提高工作效率、保障信息安全等方面发挥着越来越重要的作用。 本文将详细介绍六款市场上最受欢迎的局域网管理软件&#xff0c;帮助企业管理者更好地理解和选择适合自己的局域网管理工具。 一、局域网管理的重要性 一个高效运作的局域网不仅可以提升工作效率&…

动态内存管理申请调整和释放

动态内存管理存放在内存中的堆区中 动态内存分配的函数&#xff1a;malloc、calloc、realloc、free 动态内存分配 malloc函数&#xff08;内存申请空间&#xff09;无初始化free函数&#xff08;动态内存释放&#xff09;calloc函数&#xff08;内存空间申请&#xff09;初始化…

页面设计任务 个人简介页面

目录 任务要求 任务讲解 源码: 详细讲解 html部分 CSS部分 任务要求 页面结构: 创建一个基本的 HTML 页面&#xff0c;页面标题为“我的个人简介”。页面内容分为以下四个部分&#xff1a; 顶部导航栏: 包含至少三个导航链接&#xff0c;例如&#xff1a;“主页”、“关于…

OpenCV几何图像变换(2)计算仿射变换矩阵的函数getAffineTransform()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算三对对应点之间的仿射变换。 该函数计算 23 的仿射变换矩阵&#xff0c;使得&#xff1a; [ x i ′ y i ′ ] map_matrix ⋅ [ x i y i 1 …

Docker的安装与镜像配置

小编目前大一&#xff0c;刚开始着手学习SSM&#xff0c;小编会把每个框架都整理成知识点发布出来。如果你也同时在学习SSM的话&#xff0c;不妨看看我做的这个笔记。我认为同为初学者&#xff0c;我把我对知识点的理解以这种代码加观点的方式分享出来不仅加深了我的理解&#…

LORA通信详解

LORA&#xff08;Long Range Radio&#xff09;是一种低功耗广域网&#xff08;LPWAN&#xff09;技术&#xff0c;专门设计用于物联网&#xff08;IoT&#xff09;设备的远距离通信。其长距离传输和低功耗特性使其在智能城市、环境监测、农业等领域中得到了广泛应用。 一、LOR…

自抗扰控制ADRC原理解析及案例应用

1. ADRC基本原理 1.1 ADRC的基本概念 自抗扰控制&#xff08;Active Disturbance Rejection Control&#xff0c;ADRC&#xff09;是一种先进的控制策略&#xff0c;由韩京清研究员于1998年提出。ADRC的核心思想是将系统内部和外部的不确定性因素视为总扰动&#xff0c;并通过…

华硕飞行堡垒键盘全部失灵【除电源键】

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】 前言一、故障排查二、发现问题三、使用方法总结 前言 版本型号&#xff1a; 型号 ASUS FX53VD&#xff08;华硕-飞行堡垒&#xff09; 板号&#xff1a;GL553VD 故障情况描述&#xff1a; 键盘无法使用&#xff0c;键盘除开机键外…

heic格式怎么转成jpg?3种格式转换方法分享

heic格式怎么转成jpg&#xff1f;将HEIC格式的图片转换为JPG格式&#xff0c;是图像处理中的常见需求&#xff0c;它极大地方便了跨平台分享与浏览。通过专业的转换软件&#xff0c;我们可以轻松实现这一转换过程&#xff0c;确保图像内容在更多设备和环境中得到兼容和展示。这…

vue 接口 传参token对 返回数据不对原因

接口不携带参数 接口token 正确 但是返回数据 返回的上一次登录的数据 处理 携带个时间戳