#include <string>
#include <vector>
#include <random>
#include <memory>
class Object {
public:
virtual std::string ToString() const = 0;
virtual ~Object() {}
};
class Smth1 : public Object {
public:
explicit Smth1(const std::string &class_id) {
class_id_ = class_id;
}
std::string ToString() const override {
return class_id_;
}
private:
std::string class_id_;
};
Object *NewSomeObject(const std::string &class_id) {
return new Smth1(class_id);
}
class Factory {
public:
void Register(const std::string &class_id, Object *(*instance_creator)()) {
this->id.push_back(class_id);
this->funcs.push_back(instance_creator);
}
Object *Create(const std::string &basicString) {
for (const auto &i : this->std_id) {
if (i == basicString) {
return NewSomeObject(basicString);
}
}
for (unsigned int i = 0; i < this->id.size(); i++) {
if (this->id[i] == basicString) {
return this->funcs[i]();
}
}
return {};
}
private:
std::vector<std::string> std_id{"list", "apple!", "yet another identifier"};
std::vector<std::string> id;
std::vector<Object *(*)()> funcs;
};