设计模式-工厂方法模式(C++)

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但将实际的对象创建过程延迟到子类中。这种模式解耦了具体产品的创建过程,使得系统更加灵活和可扩展。

下面是一个使用 C++ 实现工厂方法模式的简单示例:

// 抽象产品类
class Product {
public:virtual void DoSomething() = 0;
};// 具体产品类 1
class ConcreteProduct1 : public Product {
public:void DoSomething() override {std::cout << "ConcreteProduct1 执行了某操作" << std::endl;}
};// 具体产品类 2
class ConcreteProduct2 : public Product {
public:void DoSomething() override {std::cout << "ConcreteProduct2 执行了某操作" << std::endl;}
};// 工厂类
class Factory {
public:virtual Product* CreateProduct() = 0;
};// 具体工厂类 1
class ConcreteFactory1 : public Factory {
public:Product* CreateProduct() override {return new ConcreteProduct1();}
};// 具体工厂类 2
class ConcreteFactory2 : public Factory {
public:Product* CreateProduct() override {return new ConcreteProduct2();}
};int main() {// 创建具体工厂对象Factory* factory1 = new ConcreteFactory1();Factory* factory2 = new ConcreteFactory2();// 通过工厂创建产品对象Product* product1 = factory1->CreateProduct();Product* product2 = factory2->CreateProduct();// 使用产品对象product1->DoSomething();product2->DoSomething();// 释放资源delete product1;delete product2;delete factory1;delete factory2;return 0;
}

在上述示例中,我们定义了一个抽象产品类 Product,以及两个具体产品类 ConcreteProduct1 和 ConcreteProduct2。它们都继承自 Product 类,并实现了 DoSomething 方法。

然后,我们定义了一个抽象工厂类 Factory,以及两个具体工厂类 ConcreteFactory1 和 ConcreteFactory2。它们都继承自 Factory 类,并实现了 CreateProduct 方法,用于创建具体的产品对象。

在 main 函数中,我们创建了两个具体工厂对象 factory1 和 factory2,然后通过调用 CreateProduct 方法分别创建了两个具体产品对象 product1 和 product2。最后,我们使用产品对象执行相应的操作。

通过工厂方法模式,我们将产品的创建过程封装在工厂类中,使得客户端无需关心具体的产品创建细节,只需使用工厂提供的接口即可获取相应的产品对象。这样可以提高代码的灵活性和可维护性。

抽象工厂模式和工厂方法模式都是设计模式中的创建型模式,它们在对象创建和管理方面有一些相似之处,但也存在一些区别:

  1. 产品等级结构:抽象工厂模式强调的是产品的等级结构,即一个抽象工厂可以创建多个不同类型的产品,这些产品属于一个产品族;而工厂方法模式专注于单个产品的创建过程。
  2. 灵活性:抽象工厂模式提供了更大的灵活性,因为它可以创建一系列相关的产品,而不需要关心具体的产品实现细节;工厂方法模式则更关注单个产品的创建,相对较为简单和直接。
  3. 可扩展性:抽象工厂模式在扩展产品族时需要修改抽象工厂和具体工厂类,可能会导致一定的复杂性;而工厂方法模式在扩展产品时只需要添加新的具体产品类和相应的工厂类,更容易进行扩展。
  4. 应用场景:抽象工厂模式适用于需要创建一系列相互关联或依赖的产品的情况;工厂方法模式更适合于创建单个产品,或者产品之间关系较为简单的场景。

例如,假设有一个汽车制造工厂,抽象工厂模式可能会将汽车分解为多个部分(如引擎、车轮、车身等),并提供一个抽象工厂来创建整个汽车;而工厂方法模式可能只关注创建单个部件,如引擎工厂、车轮工厂等。

总的来说,选择使用哪种模式取决于具体的需求和设计情况。如果需要创建一系列相关的产品并且产品之间存在复杂的关系,抽象工厂模式可能更合适;如果只需要创建单个产品或者产品之间关系简单,工厂方法模式可能更易于使用和维护。

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

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

相关文章

pytest结合Allure生成测试报告

文章目录 1.Allure配置安装2.使用基本命令报告美化1.**前置条件**2.**用例步骤****3.标题和描述****4.用例优先级**3.进阶用法allure+parametrize参数化parametrize+idsparametrize+@allure.title()4.动态化参数5.环境信息**方式一****方式二**6.用例失败截图1.Allure配置安装 …

Jmeter基础(2) 目录介绍

目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前&#xff0c;需要先对工具的目录有些了解&#xff0c;也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…

代码随想录 | 216.组合总和III● 17.电话号码的字母组合

216.组合总和III 思路&#xff1a; 和77. 组合思路一致&#xff0c;只不过多了一个cursum用来记录总和。 代码&#xff1a; class Solution:def combinationSum3(self, k: int, n: int) -> List[List[int]]:path []result []def backtracking( k, n, start, cursum):i…

web安全学习笔记【15】——信息打点(5)

信息打点-CDN绕过&业务部署&漏洞回链&接口探针&全网扫描&反向邮件 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

基于springboot财务管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

【C语言必知必会 | 第一篇】C语言入门,这一篇就够了

引言 C语言是一门面向过程的、抽象化的通用程序设计语言&#xff0c;广泛应用于底层开发。它在编程语言中具有举足轻重的地位。 此文为【C语言必知必会】系列第一篇&#xff0c;带你初步了解C语言&#xff0c;为之后的学习打下基础 文章目录 1️⃣发展历史2️⃣语言特点3️⃣语…

论文精读--GPT2

被BERT敲打了&#xff0c;但是仍然坚持解码器架构 Abstract Natural language processing tasks, such as question answering, machine translation, reading comprehension, and summarization, are typically approached with supervised learning on taskspecific dataset…

使用代理IP技术实现爬虫同步获取和保存

概述 在网络爬虫中&#xff0c;使用代理IP技术可以有效地提高爬取数据的效率和稳定性。本文将介绍如何在爬虫中同步获取和保存数据&#xff0c;并结合代理IP技术&#xff0c;以提高爬取效率。 正文 代理IP技术是一种常用的网络爬虫技术&#xff0c;通过代理服务器转发请求&a…

idea和jdk之间对应的版本(idea支持的jdk版本)

idea如果和jdk版本不对应&#xff0c;就会出现无法运行的情况&#xff0c;如下&#xff1a; 翻译&#xff1a;无法确定17的“tools.jar”库的路径&#xff08;C:\Program Files\Java\jdk-17&#xff09; 原因&#xff1a;idea版本是2020.2&#xff0c;而jdk版本是17&#xff0…

动态规划-

关键词&#xff1a; 重叠子问题&#xff1b;每一个状态一定是由上一个状态推导出来(类似数列a^n f(a^n-1,a^n-2)) 步骤&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 题目&#…

01_02_mysql06_(视图-存储过程-函数(变量、流程控制与游标)-触发器)

视图 使用 视图一方面可以帮我们使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。比如&#xff0c;针对一个公司的销售人员&#xff0c;我们只想给他看部分数据&#xff0c;而某些特殊的数据&#xff0c;比如采购的价格&#xff0…

多微服务合并为一个服务

公司微服务细分太多&#xff0c;最近跟我提说需要将几个微服务合为单体&#xff0c;经过几天的查阅&#xff0c;决定用二次打包的方式进行合并&#xff0c;然后部署的时候在nginx改下合并的微服务转发路劲即可&#xff0c;不需要前端修改路劲了。 方案 采用二次打包的方式进行…

【2024软件测试面试必会技能】Unittest(6):unittest_构建测试套件

构建测试套件 在实际项目中&#xff0c;随着项目进度的开展&#xff0c;测试类会越来越多&#xff0c;可是直到现在我 们还只会一个一个的单独运行测试类&#xff0c;这在实际项目实践中肯定是不可行的&#xff0c;在 unittest中可以通过测试套件来解决该问题。 测试套件&…

目标检测-Transformer-ViT和DETR

文章目录 前言一、ViT应用和结论结构及创新点 二、DETR应用和结论结构及创新点 总结 前言 随着Transformer爆火以来&#xff0c;NLP领域迎来了大模型时代&#xff0c;成为AI目前最先进和火爆的领域&#xff0c;介于Transformer的先进性&#xff0c;基于Transformer架构的CV模型…

代购系统上下架商品|商品采集|1688淘宝商品关键词搜索

- item_get 获得淘宝商品详情 [获取API测试权限&#xff0c;进入测试页] - item_get_pro 获得淘宝商品详情高级版 - item_review 获得淘宝商品评论 - item_fee 获得淘宝商品快递费用 - item_password 获得淘口令真实url - item_list_updown 批量获得淘宝商品…

Redis之在Windows安装及高版本编译安装方法

Redis之在Windows安装及高版本编译安装方法 文章目录 Redis之在Windows安装及高版本编译安装方法1. Redis-x64-3.2.100.zip版本安装1. 下载与安装2. 将Redis注册为Windows的服务运行3.远程连接设置 2. Windows中高版本编译安装 Redis官方并未提供Windows版本的Redis数据库&…

C语言深入剖析——函数栈帧的创建与销毁

目录 0.前言 1.什么是函数栈帧 1.1栈帧的组成 1.2栈帧的作用 1.3栈帧的管理 2.理解函数栈帧的作用 3.解析函数栈帧的创建与销毁 3.1栈的介绍 3.2寄存器简介 3.3汇编指令简介 3.4具体过程解析 3.4.1预备知识 3.4.2函数的调用堆栈 3.4.3转到反汇编 3.4.4函数栈帧的…

【Python_Zebra斑马打印机编程学习笔记(一)】实现标贴预览的两种方式

实现标贴预览的两种方式 实现标贴预览的两种方式前言一、调用 Labelary Online ZPL Viewer API 方法实现标贴预览功能1、Labelary Online ZPL Viewer API 案例介绍2、生成 PNG 格式3、Parameters 二、通过 zpl 的 label.preview() 方法实现标贴预览功能1、实现步骤2、代码示例 …

Python实战:读取MATLAB文件数据(.mat文件)

Python实战&#xff1a;读取MATLAB文件数据(.mat文件) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅…

R语言【base】——abs(),sqrt():杂项数学函数

Package base version 4.2.0 Description abs(x) 计算 x 的绝对值&#xff0c;sqrt(x) 计算 x 的正平方根。 Usage abs(x) sqrt(x) Arguments 参数【x】&#xff1a;一个数值或复数向量或数组。 Details 这些都是内部泛型原语函数:可以为它们单独定义方法&#xff0c;也可以…