工厂方法顾名思义 通过你传入的参数 我来实例化不同的对象 然后再返回给你基类的指针 这样你在初始化对象的时候就很方便 注意一定是对象的初始化很麻烦的时候才使用这种方法 不然不推荐使用
#include <string>
// 实现导出数据的接口, 导出数据的格式包含 xml,json,文本格式txt 后面可能扩展excel格式csv
class IExport {
public:
virtual bool Export(const std::string &data) = 0;
virtual ~IExport(){}
};
class ExportXml : public IExport {
public:
virtual bool Export(const std::string &data) {
return true;
}
};
class ExportJson : public IExport {
public:
virtual bool Export(const std::string &data) {
return true;
}
};
class ExportTxt : public IExport {
public:
virtual bool Export(const std::string &data) {
return true;
}
};
class IExportFactory {
public:
virtual IExport * NewExport(/* ... */) = 0;
};
class ExportXmlFactory : public IExportFactory {
public:
IExport * NewExport(/* ... */) {
// 可能有其它操作,或者许多参数
IExport * temp = new ExportXml;
// 可能之后有什么操作
return temp;
}
};
class ExportJsonFactory : public IExportFactory {
public:
IExport * NewExport(/* ... */) {
// 可能有其它操作,或者许多参数
IExport * temp = new ExportJson;
// 可能之后有什么操作
return temp;
}
};
class ExportTxtFactory : public IExportFactory {
public:
IExport * NewExport(/* ... */) {
// 可能有其它操作,或者许多参数
IExport * temp = new ExportTxt;
// 可能之后有什么操作
return temp;
}
};
class ExportData {
public:
ExportData(IExportFactory *factory) : _factory(factory) {}
~ExportData() {
if (_factory) {
delete _factory;
_factory = nullptr;
}
}
bool Export(const std::string &data) {
IExport * e = _factory->NewExport();
e->Export(data);
}
private:
IExportFactory *_factory;
};
int main() {
ExportData ed(new ExportTxtFactory);
ed.Export("hello world");
return 0;
}
main函数中 通过一个ExportTxtFactory创建了一个Txt工厂 然后通过调用Export函数来选择了他具体的实现 可能是jason xml excel 或者其他格式 这样就很舒服
适配器模式相信是大家用的比较多的了 因为大家都喜欢去github去搜集一些优质的源代码 但是无奈项目中一些接口已经写好 无法更改 只能通过适配器模式将两个接口巧妙的连接起来
如图 Proxy就是一个代理类 Subject调用统一的Request接口 然后Proxy会去查询ConcreteSubject的结果