#include <string>
#include <vector>
#include <utility>
class Object {
public:
virtual std::string ToString() const = 0;
virtual ~Object() {}
};
class Apple : public Object{
public:
std::string ToString() const override { return "apple!"; }
};
class List : public Object{
public:
std::string ToString() const override { return "list"; }
};
class Another : public Object{
public:
std::string ToString() const override { return "yet another identifier"; }
};
class Factory {
std::vector<std::pair<std::string, Object*(*)()>> vec;
public:
Object* Create(const std::string& class_id) {
Object* obj = nullptr;
if (class_id == "apple!") {
obj = new Apple();
} else if (class_id == "list") {
obj = new List();
} else if (class_id == "yet another identifier") {
obj = new Another();
} else {
for (auto i : vec) {
if (i.first == class_id) {
obj = i.second();
break;
}
}
}
return obj;
}
void Register(const std::string& class_id, Object*(*instance_creator)()) {
vec.push_back({class_id, instance_creator});
}
};