Я реализую класс, который может загружать файл из различных источников, таких как ftp, http и т. Д. Я начал со следующего интерфейса
class IInternetFileDownloader
{
public:
IInternetFileDownloader() = default;
virtual void Download(const std::string& urlToDownloadFrom) = 0;
};
Затем я реализовал классы, которые будут выполнять фактическую загрузку изсоответствующая конечная точка.Итак, у меня есть HttpFileDownloader.h как показано ниже
#include "IInternetFileDownloader.h"
class HttpFileDownloader : public IInternetFileDownloader
{
public:
HttpFileDownloader() = default;
virtual void Download(const std::string& urlToDownloadFrom)
{
// download implementation
}
};
Итак, у меня есть FtpFileDownloader .h как показано ниже
#include "IInternetFileDownloader.h"
class FtpFileDownloader : public IInternetFileDownloader
{
public:
FtpFileDownloader() = default;
virtual void Download(const std::string& urlToDownloadFrom)
{
// download implementation
}
};
Я могу вызвать соответствующий класс, как показано ниже
#include "IInternetFileDownloader.h"
#include "HttpFileDownloader.h"
int main()
{
std::string downloadFromUrl = "http://www.example.org/xyz.zip";
IInternetFileDownloader* download = new HttpFileDownloader();
download->Download(downloadFromUrl);
}
Однако я не хочу создавать здесь конкретные HttpFileDownloader или FtpFileDownloader.На мой взгляд, должен быть другой класс, который может просто взять URL-адрес и, в зависимости от протокола, он может создать соответствующий класс.Таким образом, клиентскому коду (main.cpp) не нужно беспокоиться об экземпляре соответствующего класса.Я читал о шаблонах проектирования фабрики и строителя и немного запутался, какой из них лучше всего использовать в этом сценарии?