工厂方法(整理自李建忠C++设计模式视频)

2024-02-03 21:38

本文主要是介绍工厂方法(整理自李建忠C++设计模式视频),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

整理自李建忠<C++设计模式>视频:https://www.bilibili.com/video/BV1kW411P7KS?p=8

一.导入:"对象创建"模式和工厂模式

工厂模式只是该模式下的一种.

 二.举例说明

有这样一个场景:需要在MainForm中设计一个按钮,这个按钮具有文件分割的功能,支持多种类型的文件分割,比如二进制,文本类型.

不使用工厂模式的设计场景:

MainForm.cpp:

 1 class MainForm2 {3 public:4     MainForm() {5     }6 7     void Btn1Click()8     {
15         ISplit *splitter = new BinarySplit();
16         splitter->SplitFunc();
18     }
19 };

Split.hpp

 1 #pragma once2 #include"stdio.h"3 //抽象基类4 class ISplit5 {6 public:7     ISplit() {}8     virtual ~ISplit() {}9 
10     virtual void SplitFunc() = 0;
11 };
12 
13 //具体类
14 class BinarySplit :public ISplit
15 {
16 public:
17     void SplitFunc()
18     {
19         printf("This is BinarySplit\n");
20     }
21 };
22 
23 class TxtSplit : public ISplit
24 {
25 public:
26     void  SplitFunc()
27     {
28         printf("This is TxtSplit\n");
29     }
30 };

可以看到即便是Split.cpp中使用了多态的方法,在MainForm.cpp中的Btn1Click()还是会依赖于具体的类型,如果要实现别的类的切割函数,就需要在函数里添写,很不符合代码的复用性.

引入工厂模式后的场景:

Split.hpp保持不变

增加SplitFactory.hpp文件

 1 #include"Split.hpp"2 //工厂基类3 class ISplitFactory4 {5     public:6         ISplitFactory() {7 8     }9         virtual ~ISplitFactory()
10         {
11 
12     }
13 
14     virtual ISplit *CreateSplitter() = 0;
15 };
16 
17 //具体工厂
18 class BinarySplitFactory : public ISplitFactory
19 {
20     public:
21         ISplit *CreateSplitter()
22         {
23             return new BinarySplit();
24     }
25 };
26 
27 class TxtSplitFactory : public ISplitFactory
28 {
29     public:
30         ISplit *CreateSplitter()
31         {
32             return new TxtSplit();
33     }
34 };

修改MainForm.cpp文件.

#include"Split.hpp"
#include"SplitFactory.hpp"class MainForm
{
public:ISplitFactory *splitFactory;MainForm(ISplitFactory *splitFactory) {this->splitFactory = splitFactory;}void Btn1Click(){ISplit *splitter = splitFactory->CreateSplitter();//通过工厂模式做成了"多态new"splitter->SplitFunc();}};

这里增加的工厂基类同样定义了一个纯虚函数,用来创建Split对象,而实现的过程在子类中进行实现,这样的话就相当于延迟到子类.

上面的情况在MainForm.cpp中通过接受传递过来的splitFactory来确定运行时应该执行谁的函数.在这种模式下,对具体类型的依赖被放到了外边(main.cpp这个调用方)了,而上述代码里面不再存在依赖.

此时的main函数:

int main()
{ISplitFactory *splitFactory = new BinarySplitFactory();MainForm mf(splitFactory);mf.Btn1Click();return 0;
}

//注:这里没有考虑内存管理,正常应该在析构函数中delete掉堆上的内存

工厂模式那里,有些朋友疑惑为啥不直接传ISplitter就好了,同样是从外部传参,何必那么麻烦另外写个工厂?我觉得是因为如果直接传ISplitter,那这个方法只能用到这么一个ISplitter,而工厂却可以“批量生产”,这就是工厂的优势

--摘自https://www.bilibili.com/video/BV1kW411P7KS?p=8的切切切Y的评论.

三.结构总结

红色的部分是稳定的,蓝色的部分是变化的.让MainForm依赖红色的.

 

这篇关于工厂方法(整理自李建忠C++设计模式视频)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675495

相关文章

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方