1.示例:
场景:
代码:
#include <iostream>
#include <string>
using namespace std;
class ExportFileAPI
{
public:
virtual bool exportData(string data) = 0;
protected:
ExportFileAPI(){}
};
//具体化的子类
class ExportTxtFile:public ExportFileAPI
{
public:
bool exportData(string data)
{
cout << "正在导出数据" << data << "到csv文件"<<endl;
return true;
}
};
class ExportDB:public ExportFileAPI
{
public:
bool exportData(string data)
{
cout << "正在导出数据" << data << "到数据库" << endl;
return true;
}
};
//实现一个ExportOperator的类,这个叫导出数据业务的功能对象
//它也是接口
class ExportOperator
{
public:
bool exportData(string data)
{
ExportFileAPI* pAPI = factoryMethod();
return pAPI->exportData(data);
}
protected:
virtual ExportFileAPI* factoryMethod() = 0;
};
//具体的实现对象完成导出工作
class ExportTxtFileOperator :public ExportOperator
{
protected:
ExportFileAPI* factoryMethod()
{
return new ExportTxtFile();
}
};
class ExportDBOperator :public ExportOperator
{
protected:
ExportFileAPI* factoryMethod()
{
return new ExportDB();
}
};
//客户端
int main()
{
ExportOperator* pOperator = new ExportTxtFileOperator();
pOperator->exportData("Hello");
return 0;
}
UML图:
分析:
客户端只知道ExportOperator、ExportTxtFileOperator 、ExportDBOperator 的存在,并且知道exportData方法能够导出数据,但是它不知道factoryMethod方法的存在
2.工厂方法模式
(1)功能
让父类在不知道具体实现的情况下,完成自身的功能调用(如ExportOperator不知道factoryMethod方法的实现,却在它的exportData方法中调用了factoryMethod方法),而具体的实现延迟到了子类来实现。
(2)工厂方法模式中类的实现的说明
实现抽象类:
通常父类是一个抽象类,里面包含创建所需对象的抽象方法,这些抽象方法就是工厂方法
实现具体类:
父类也可以实现为具体类,这种情况下,通常在父类中提供获取所需对象的默认实现方法,这样就算没有具体的类,也能运行
(3)工厂方法的参数和返回值
工厂方法的实现中可能需要参数,以便决定到底采用哪一种具体的实现
一般返回值为被创建对象的接口对象,当然也可以是抽象类或具体类的实例
(4)工厂方法的结构
(5)工厂方法模式与简单工厂的对比
简单工厂:
最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖
工厂方法:
客户端需要决定实例化哪一个工厂来实现ConcreteProduct类,选择的问题还是存在,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行
3.工厂方法模式的工程应用
待STL学完后更新