工厂模式

是“对象创建模式”一类的设计模式。

通过“对象创建”模式,绕开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++多态的晚绑定特性,改编译时依赖为运行时依赖;

例:

基本基类为分类器,基本子类为分类器(文本)、分类器(视频)等等