引言

在软件开发中,设计模式是解决常见问题的经过验证的方案。其中,工厂方法模式是一种创建型设计模式,广泛应用于需要动态创建对象的场景。本文将详细介绍工厂方法模式的核心概念、应用场景,并通过C++代码示例展示其具体实现。

核心概念

工厂方法模式通过将对象的创建委托给子类,提高了系统的灵活性和扩展性。以下是其核心概念:

抽象工厂接口

定义一个创建产品的抽象方法。例如:

class GuoYao {
public:virtual ~GuoYao() = default;virtual YongYong* createYongYong() = 0;
};

具体工厂类

实现抽象工厂接口,负责创建具体的产品实例。例如:

class CommonYongYongFactory : public GuoYao {
public:YongYong* createYongYong() override {return new CommonYongYong();}
};

抽象产品类

定义产品的接口,具体产品类实现该接口。例如:

class YongYong {
public:virtual ~YongYong() = default;virtual void attack() = 0;virtual void defense() = 0;
};

具体产品类

实现抽象产品类,提供具体功能。例如:

class CommonYongYong : public YongYong {
public:void attack() override {std::cout << "普通勇勇发起普通攻击。" << std::endl;}void defense() override {std::cout << "普通勇勇进行普通防御。" << std::endl;}
};class AdvancedYongYong : public YongYong {
public:void attack() override {std::cout << "高级勇勇发起强力攻击。" << std::endl;}void defense() override {std::cout << "高级勇勇进行高级防御。" << std::endl;}
};

结构与示例

示例:国遥创建勇勇

假设我们有一个游戏系统,其中有一个角色“勇勇”,而“国遥”是一个工厂,负责创建不同类型的“勇勇”角色。我们可以使用工厂方法模式来实现这个功能,从而动态地创建不同类型的“勇勇”角色。

步骤 1:定义抽象产品类

// 抽象产品类:勇勇角色
class YongYong {
public:virtual ~YongYong() = default;virtual void attack() = 0;virtual void defense() = 0;
};

步骤 2:实现具体产品类

// 具体产品类:普通勇勇
class CommonYongYong : public YongYong {
public:void attack() override {std::cout << "普通勇勇发起普通攻击。" << std::endl;}void defense() override {std::cout << "普通勇勇进行普通防御。" << std::endl;}
};// 具体产品类:高级勇勇
class AdvancedYongYong : public YongYong {
public:void attack() override {std::cout << "高级勇勇发起强力攻击。" << std::endl;}void defense() override {std::cout << "高级勇勇进行高级防御。" << std::endl;}
};

步骤 3:定义抽象工厂接口

// 抽象工厂接口:国遥工厂
class GuoYao {
public:virtual ~GuoYao() = default;virtual YongYong* createYongYong() = 0;
};

步骤 4:实现具体工厂类

// 具体工厂类:普通勇勇工厂
class CommonYongYongFactory : public GuoYao {
public:YongYong* createYongYong() override {return new CommonYongYong();}
};// 具体工厂类:高级勇勇工厂
class AdvancedYongYongFactory : public GuoYao {
public:YongYong* createYongYong() override {return new AdvancedYongYong();}
};

步骤 5:使用工厂方法模式

#include <iostream>int main() {// 创建工厂实例GuoYao* commonFactory = new CommonYongYongFactory();GuoYao* advancedFactory = new AdvancedYongYongFactory();// 使用工厂创建勇勇角色YongYong* commonYongYong = commonFactory->createYongYong();commonYongYong->attack();   // 输出: 普通勇勇发起普通攻击。commonYongYong->defense();  // 输出: 普通勇勇进行普通防御。delete commonYongYong;delete commonFactory;YongYong* advancedYongYong = advancedFactory->createYongYong();advancedYongYong->attack();   // 输出: 高级勇勇发起强力攻击。advancedYongYong->defense();  // 输出: 高级勇勇进行高级防御。delete advancedYongYong;delete advancedFactory;return 0;
}

代码解释

  • 抽象产品类 YongYong :定义了勇勇角色的接口,包括 attackdefense 方法。
  • 具体产品类 CommonYongYongAdvancedYongYong :分别实现了普通勇勇和高级勇勇的角色,具有不同的攻击和防御行为。
  • 抽象工厂接口 GuoYao :声明了创建勇勇角色的方法 createYongYong
  • 具体工厂类 CommonYongYongFactoryAdvancedYongYongFactory :实现了 createYongYong 方法,分别返回普通勇勇和高级勇勇的实例。
  • 客户端代码:创建具体的工厂实例,调用 createYongYong 方法创建勇勇角色,并调用其方法执行攻击和防御动作。

优点

  1. 遵循开闭原则:当需要添加新的勇勇类型时,只需新增具体工厂类和具体产品类,无需修改现有代码。
  2. 隐藏创建细节:客户端代码只需关注工厂接口,无需了解具体勇勇角色的创建细节。
  3. 提高灵活性和扩展性:便于维护和升级系统,适应不同的需求变化。

C++标准库中的应用

C++标准库中有多处地方采用了工厂方法模式,以下是一些主要组件:

  1. 输入输出流库 (<iostream>)

通过构造函数创建不同类型的流对象,如 std::ofstreamstd::ifstream

std::ofstream fout("output.txt");
std::ifstream fin("input.txt");
  1. 智能指针 (<memory>)

通过工厂函数 std::make_uniquestd::make_shared 创建智能指针。

std::unique_ptr<int> p1 = std::make_unique<int>(10);
std::shared_ptr<int> p2 = std::make_shared<int>(20);
  1. 容器类 (<vector>, <list>, 等)

通过构造函数和成员函数动态管理容器内容。

std::vector<int> vec(5, 0);
vec.resize(10);
vec.emplace_back(100);
  1. 线程类 (<thread>)

通过构造函数创建线程。

std::thread t(threadFunction);
t.join();
  1. 正则表达式类 (<regex>)

通过构造函数创建正则表达式对象。

std::regex re("^[a-zA-Z]+$");
std::string str = "Hello";
std::regex_match(str, re);

总结

通过上述步骤和代码示例,我成功地实现了工厂方法模式,并将其应用于“国遥创建勇勇”的场景中。这个过程不仅加深了我对工厂方法模式的理解,也让我认识到在实际项目中合理应用设计模式的重要性。通过这种方式,我们可以设计出更加灵活和可扩展的系统,从而更好地应对需求的变化和扩展。

C++标准库中广泛使用工厂方法模式,这进一步证明了该模式在软件开发中的重要性和实用性。通过学习和应用工厂方法模式,我们可以提高代码的质量和系统的维护性,为开发更加 robust 和可扩展的软件打下坚实的基础。

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

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

相关文章

我的世界进阶模组开发教程——伤害(2)

上一篇文章简要的讲述了伤害,这一篇文章就来讲一下机械动力的伤害 机械动力源码 DamageTypeBuilder 类定义与成员变量 public class DamageTypeBuilder {protected final ResourceKey<DamageType> key; // 伤害类型的唯一资源标识符

web前端第一次作业

一、用户注册界面作业要求: 1.用户名为文本框&#xff0c;名称为 UserName&#xff0c;长度为 15&#xff0c;最大字符数为 20 2.密码为密码框&#xff0c;名称为 UserPass&#xff0c;长度为 15&#xff0c;最大字符数为 20 3.性别为两个单选按钮&#xff0c;名称为 sex&#…

Jenkins 节点连接故障定位及解决方案总结 - PKIX path validation failed

一、故障现象 Jenkins 节点通过 Java Web 方式连接时&#xff0c;报错&#xff1a; java.io.IOException: Failed to connect to https://xxxx.zte.com.cn/yyyy/tcpSlaveAgentListener/: PKIX path validation failed: java.security.cert.CertPathValidatorException: validit…

c++ --- priority_queue的使用以及简单实现

C --- priority_queue前言一、priority_queue的使用二、priority_queue的简单实现1.整体结构2.主要方法pushpoptopemptysize三、构造迭代器区间构造默认构造四、仿函数前言 priority_queue是C容器之一&#xff0c;意为优先级队列&#xff0c;虽说叫做队列&#xff0c;但是其底…

MySQL梳理三:查询与优化

MySQL查询优化完整指南&#xff1a;从理论到实践 本文从MySQL查询的基础机制出发&#xff0c;深入探讨单表查询访问方法、联表查询策略、成本计算原理、基于规则的优化技术&#xff0c;最后通过实际案例展示慢SQL的诊断和优化过程。 目录 一、单表查询的访问方法二、联表查询机…

从零开始的python学习(九)P129+P130+P131+P132+P133

本文章记录观看B站python教程学习笔记和实践感悟&#xff0c;视频链接&#xff1a;【花了2万多买的Python教程全套&#xff0c;现在分享给大家&#xff0c;入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…

LCL滤波器及其电容电流前馈有源阻尼设计软件【LCLAD_designer】

本文主要介绍针对阮新波著《LCL型并网逆变器的控制技术》书籍 第二章&#xff08;LCL滤波器设计&#xff09;及第五章&#xff08;LCL型并网逆变器的电容电流反馈有源阻尼设计&#xff09;开发的一款交互式软件【LCL&AD_designer】&#xff0c;开发平台MATLAB_R2022b/app d…

【Conda】配置Conda镜像源

Conda 镜像源配置指南 适用系统&#xff1a;Windows 10&#xff08;含 Miniconda / Anaconda&#xff09; & Linux&#xff08;Ubuntu / CentOS / Debian 等&#xff09;1. 为什么要设置镜像源 在中国大陆直接访问 repo.anaconda.com 经常遇到速度慢、连接超时、SSL 错误等…

八股取士--docker

基础概念类 1. 什么是Docker&#xff1f;它解决了什么问题&#xff1f; 解析&#xff1a; Docker是一个开源的容器化平台&#xff0c;用于开发、交付和运行应用程序。 主要解决的问题&#xff1a; 环境一致性&#xff1a;解决"在我机器上能跑"的问题资源利用率&#…

C++:STL中的栈和队列的适配器deque

学习完string类、容器vector和容器list&#xff0c;再去学习其他容器的学习成本就非常低&#xff0c;容器的使用方法都大差不差&#xff0c;而栈和队列的底层使用了适配器&#xff0c;去模拟实现就没有那么麻烦&#xff0c;适配器也是一种容器&#xff0c;但是这种容器兼备栈和…

9类主流数据库 - 帮你更好地进行数据库选型!

作者&#xff1a;唐叔在学习 专栏&#xff1a;数据库学习 标签&#xff1a;数据库选型、MySQL、Redis、MongoDB、大数据存储、NoSQL、数据库优化、数据架构、AI数据库 大家好&#xff0c;我是你们的老朋友唐叔&#xff01;今天咱们来聊聊程序员吃饭的家伙之一 —— 数据库。在这…

推送本地项目到Gitee远程仓库

文章目录前言前面已加学习了下载gitee软件&#xff0c;网址在上一篇文章。在gitee创建账号与仓库。现在来学习如何讲本地项目推送到Gitee远程仓库一、流程总结前言 前面已加学习了下载gitee软件&#xff0c;网址在上一篇文章。在gitee创建账号与仓库。现在来学习如何讲本地项目…

CMake 命令行参数完全指南(5)

​**40. --version**​ ​解释​&#xff1a;显示CMake版本 ​示例​&#xff1a; cmake --version # 输出&#xff1a;cmake version 3.25.2​**41. --warn-uninitialized**​ ​解释​&#xff1a;警告未初始化的变量 ​适用场景​&#xff1a;检测脚本错误 ​示例​&#xf…

基于Python实现生产者—消费者分布式消息队列:构建高可用异步通信系统

深入剖析分布式消息队列的核心原理与Python实现&#xff0c;附完整架构设计和代码实现引言&#xff1a;分布式系统的通信基石在微服务架构和云原生应用普及的今天&#xff0c;服务间的异步通信成为系统设计的核心挑战。当单体应用拆分为数十个微服务后&#xff0c;服务间通信呈…

【大模型核心技术】Agent 理论与实战

一、基本概念 LLM 特性&#xff1a;擅长理解和生成文本&#xff0c;但采用 “一次性” 响应模式&#xff0c;本质上是无记忆的生成模型。Agent 本质&#xff1a;包含 LLM 的系统应用&#xff0c;具备自主规划、工具调用和环境反馈能力&#xff0c;是将 LLM 从 “聊天机器人” 升…

Maven - 依赖的生命周期详解

作者&#xff1a;唐叔在学习 专栏&#xff1a;唐叔的Java实践 标签&#xff1a;Maven依赖管理、Java项目构建、依赖传递性、Spring Boot依赖、Maven最佳实践、项目构建工具、依赖冲突解决、POM文件详解 文章目录一、开篇二、Maven依赖生命周期2.1 依赖声明阶段&#xff1a;POM文…

从零打造大语言模型--处理文本数据

从零打造大语言模型 第 1 章&#xff1a;处理文本数据 章节导读 在把文本投喂进 Transformer 之前&#xff0c;需要两步&#xff1a;① 将字符流切分成离散 Token&#xff1b;② 把 Token 映射成连续向量。 1.1 理解词嵌入&#xff08;Word Embedding&#xff09; 嵌入向量 一…

【Spring】Bean的生命周期,部分源码解释

文章目录Bean 的生命周期执行流程代码演示执行结果源码阅读AbstractAutowireCapableBeanFactorydoCreateBeaninitializeBeanBean 的生命周期 生命周期指的是一个对象从诞生到销毁的整个生命过程&#xff0c;我们把这个过程就叫做一个对象的声明周期 Bean 的声明周期分为以下 …

[spring-cloud: 服务发现]-源码解析

DiscoveryClient DiscoveryClient 接口定义了常见的服务发现操作&#xff0c;如获取服务实例、获取所有服务ID、验证客户端可用性等&#xff0c;通常用于 Eureka 或 Consul 等服务发现框架。 public interface DiscoveryClient extends Ordered {/*** Default order of the dis…

QML 基础语法与对象模型

QML (Qt Meta-Object Language) 是一种声明式语言&#xff0c;专为创建流畅的用户界面和应用程序逻辑而设计。作为 Qt 框架的一部分&#xff0c;QML 提供了简洁、直观的语法来描述 UI 组件及其交互方式。本文将深入解析 QML 的基础语法和对象模型。 一、QML 基础语法 1. 基本对…