工厂模式(整理自李建忠<C++设计模式>视频)
时间:2019-09-28
本文章向大家介绍工厂模式(整理自李建忠<C++设计模式>视频),主要包括工厂模式(整理自李建忠<C++设计模式>视频)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
整理自李建忠<C++设计模式>视频
一.导入:"对象创建"模式和工厂模式
工厂模式只是该模式下的一种.
二.举例说明
有这样一个场景:需要在MainForm中设计一个按钮,这个按钮具有文件分割的功能,支持多种类型的文件分割,比如二进制,文本类型.
不使用工厂模式的设计场景:
MainForm.cpp:
1 class MainForm 2 { 3 public: 4 MainForm() { 5 } 6 7 void Btn1Click() 8 { 9 #if 0 10 //方式1 11 BinarySplit binarySplit; 12 binarySplit.SplitFunc(); 13 #else 14 //方式2 15 ISplit *splitter = new BinarySplit(); 16 splitter->SplitFunc(); 17 #endif 18 } 19 };
Split.hpp
1 #pragma once 2 #include"stdio.h" 3 //抽象基类 4 class ISplit 5 { 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 ISplitFactory 4 { 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函数:
int main() { ISplitFactory *splitFactory = new BinarySplitFactory(); MainForm mf(splitFactory); mf.Btn1Click(); return 0; }
//注:这里没有考虑内存管理,正常应该在析构函数中delete掉堆上的内存
三.结构总结
红色的部分是稳定的,蓝色的部分是变化的.让MainForm依赖红色的.
原文地址:https://www.cnblogs.com/Stephen-Qin/p/11604941.html
- GNU tar 解压路径绕过漏洞(CVE-2016-6321) 分析
- Memcached 命令执行漏洞(CVE-2016-8704、CVE-2016-8705、CVE-2016-8706)简析
- 使用Hue创建Ssh的Oozie工作流时重定向输出日志报错分析
- Joomla未授权创建特权用户漏洞(CVE-2016-8869)分析
- 检测本地文件躲避安全分析
- 如何在Kerberos的Linux上安装及配置Impala的ODBC驱动
- 对抗静态分析——so文件的加密
- Bypass unsafe-inline mode CSP
- Joomla未授权创建用户漏洞(CVE-2016-8870)分析
- 如何将HDFS文件系统挂载到Linux本地文件系统
- 使用 XML 内部实体绕过 Chrome 和 IE 的 XSS 过滤器
- 响应式编程的实践
- S2-045 原理初步分析(CVE-2017-5638)
- 如何在HDFS上查看YARN历史作业运行日志
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法