工厂模式
是“对象创建模式”一类的设计模式。
通过“对象创建”模式,绕开new,(new带来了细节依赖)来避免对象创建(new)过程中所导致的紧耦合(依赖具体类,加粗部分),从而支持对象创建的稳定。它是接口抽象之后的第一步操作。
动机:创建对象,需求较多,需要创建不同类型的对象
二进制文件分割器;文本文件分割器;视频文件分割器;图片文件分割器;音频文件分割器;
基类!
面向接口编程:
依赖倒置原则:应该依赖抽象,不应依赖实现细节
ISplitter *splitter = (抽象依赖)-编译时依赖
new BinarySplitter(filePath,number);(细节依赖)
存在一处细节依赖,就存在问题!
how to solve?
解决什么问题的?
面向接口编程所必然提出的一个需求!
抽丝剥茧还原最初的设计场景!
1.栈上声明对象
2.堆上创建对象
还有什么创建对象的方法?
class SplitterFactory
{
public:
virtual ISplitter* CreateSplitter()=0;
//{
//return new BinarySplitter();
//}
//};
依然不行,没有绕出去!
运行时依赖:virtual
调用虚函数,需要交给未来
纯虚基类:
创建指针
虚基类/虚工厂基类,实际类/工厂类;
//多态new
mainform内不依赖具体基类,其他地方不管
编译时依赖,运行时依赖!
使一个类的实例化得到了延时,延时到子类
目的:解耦,手段:虚函数
稳定的,变化的!
面向对象的手法:多态
一种扩展而非更改的策略
延时而非更改!
MainForm本身是稳定的!
解决的是“单个对象”的需求变化,缺点在于要求创建方法/参数相同!
映射到代码!
刚刚实现时,未考虑内存管理的问题!
通过工厂基类指针,指向工厂子类方法来实现,分类器类的对象的创建
基本基类与基本派生类,解决的是等号左边的问题,即可以用父类指针指向子类对象;
工厂类的目的即是返回基本基类的指针,但这个指针要根据不同的子类,指向不同的子类对象,工厂子类的实现,即是将基本基类指针指向基本子类对象;
应用流程:基本基类声明一个基类指针,工厂基类声明一个工厂基类指针,将工厂基类指针指向工厂子类对象,工厂基类指针调用对象创建方法(多态),返回指向基本子类对象的指针给基本基类指针;
工厂类的作用,就是创建对象,以在mainForm中避免new的方式。
应用c++多态的晚绑定特性,改编译时依赖为运行时依赖;
例:
基本基类为分类器,基本子类为分类器(文本)、分类器(视频)等等