#include <iostream>
#include <map>
#include <string>
using std::string;
using std::map;
class Object {
public:
virtual std::string ToString() const = 0;
virtual ~Object() {}
};
class Apple: public Object {
[[nodiscard]] std::string ToString() const override {
return "apple!";
}
};
class List: public Object {
[[nodiscard]] std::string ToString() const override {
return "list";
}
};
class yai : public Object {
[[nodiscard]] std::string ToString() const override {
return "yet another identifier";
}
};
class Factory {
private:
map<string, Object*(*)()> functions;
public:
Object* Create (const std::string& class_id) {
if (class_id == "apple!") {
return new Apple();
}
if (class_id == "list") {
return new List();
}
if (class_id == "yet another identifier"){
return new yai();
}
return functions[class_id]();
}
void Register(const std::string& class_id, Object*(*instance_creator)()) {
functions[class_id] = instance_creator;
}
};