整理自李建忠<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++设计模式视频)相关推荐

  1. 李建忠老师-设计模式

    前言(1) 课程目标理解松耦合设计思想掌握面向对象设计原则掌握重构技法改善设计掌握GOF核心设计补充:GOF(Gong of Gour)就是四人帮的全称.下面这本书的作者.Design Pattern ...

  2. C++课程--设计设计思想、方法与模式(李建忠老师)

    [干货回顾]李建忠老师在 Boolan 直播间和大家畅聊<C++ 软件设计与模式的道法术>,精辟囊括了<软件设计思想.方法与模式>C++课程的主要内容,以下为本期直播干货重点: ...

  3. 李建忠讲23种设计模式笔记-上

    前两天在B站看了李建忠老师讲23种设计模式的系列视频,收获颇丰.设计模式是前人的智慧和经验的总结,需要我们反复地学习.在实践中体会其蕴含的设计原则和设计思想.李老师按照封装变化将23种设计模式分成组件 ...

  4. (设计模式) (李建忠 C++) 23种设计模式

    文章目录 前言 组件协作 模板方法 Template Method 动机 模式定义 结构 代码 情景 版本1 版本2 变化原理 要点总结 个人小结 策略模式 Strategy 动机 模式定义 结构 代 ...

  5. (设计模式) (李建忠 C++) 总结

    文章目录 前言 什么是设计模式 解决复杂性的手段 分解 抽象 面向对象设计原则 依赖倒置原则(DIP) 开放封闭原则(OCP) 单一职责原则(SRP) Liskov 替换原则(LSP) 接口隔离原则( ...

  6. C++ 设计模式(8大设计原则、23种设计模式)李建忠

    简 述: 设计模式,久闻大名.此记录学习 "C++ 设计模式 李建忠" 的札记,核心共 8大设计原则.23中设计模式.后发现 GitHub 也有类似笔记 Ref1 .Ref2 相关 ...

  7. 李建忠设计模式——策略模式Strategy

    目录 1.策略模式定义 1.动机 2.模式定义 3.结构 2.实现例子 1.问题描述 2.代码实现 3.要点总结 4.参考 1.策略模式定义 1.动机 软件构建过程中,某些对象使用的算法可能多种多样, ...

  8. 清华李建忠设计模式课程感想

    最近又看了一波设计模式的东西,又有一些新的认识,设计模式一般是重构到模式,模式不是一蹴而就的,很多最开始在实现产品经理的需求时,第一版是不太能识别模式的,当然如果后期的迭代需求方向明确也可做提前设计, ...

  9. Boolan CEO 李建忠致辞2020全球产品经理大会:产品改变世界

    由Boolan主办的[2020全球产品经理大会]于2020年10月23-24日在上海龙之梦大酒店盛大召开.作为互联网产品领域阵容最强,影响力最大的行业盛会,此次大会为期两天,汇聚30余位行业顶级产品大 ...

最新文章

  1. javascript回车完美实现tab切换功能
  2. springboot通过url访问项目外的其他目录下的图片
  3. WPF自定义命令(转)
  4. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
  5. Spring 依赖注入Dependency Injection
  6. 马斯克自曝特斯拉渣产能原因:我错了,过分信任自动化机器人
  7. 在Thinkphp中使用AJAX实现无刷新分页
  8. 我发现混的好的,都是挺能“吹牛逼”的
  9. 区块链 xuperchain xuper-java-sdk 部署使用EVM 合约 教程
  10. java后台开发必备的9大类基础工具,你集齐了?
  11. 【转载】88E6390端口Link问题(PHY一直link up)BUG解决
  12. 微信小程序图片固定宽度,高度自适应处理方法及相关API介绍
  13. yml格式写法中容易遇到的坑
  14. matlab 转换 地平赤道坐标系,“赤道坐标系”与“地平坐标系”
  15. ffmpeg代码实现往视频文件里面叠加文字
  16. Windows 系统重装 - Mac 制作 Win10 启动盘
  17. python Selenium爬取数据代码学习 冲!!!
  18. 视频教程-软考信息系统项目管理师考试视频辅导课程-项目管理
  19. 医学图像的一些预处理知识
  20. 微信小程序的一级页面和二级页面设置

热门文章

  1. win11 下beyondcompare 右键菜单中无“比较“
  2. 智慧城市的互联网大脑架构图,大社交网络与智慧城市结合是关键
  3. Office 连供打印机无法进纸怎么办 卡纸,塞纸怎么办
  4. MIT 入梦实验室 梦相关新闻
  5. 如何做好SEO优化?
  6. java开发一个购物车实验,JAVAWEB购物车实验报告.doc
  7. 输出某个日期是该年的第几天
  8. Alibaba Java 2021 技术图谱——学习永无止境
  9. python实现括号匹配算法_Python实现括号匹配方法详解
  10. Java 常用的基本关键字和常用单词