#include <string>
#include <map>
using std::map;
using std::string;
class Object {
public:
virtual std::string ToString() const = 0;
virtual ~Object() {}
};
class ChildObject : public Object {
private:
string class_id;
public:
explicit ChildObject(string class_id) : class_id(class_id) {}
string ToString() const {
return class_id;
}
};
Object* regApple() { return new ChildObject("apple!"); }
Object* regList() { return new ChildObject("list"); }
Object* regYAI() { return new ChildObject("yet another identifier"); }
class Factory {
private:
map<string, Object* (*) ()> registrList;
public:
Factory() {
Register("apple!", regApple);
Register("list", regList);
Register("yet another identifier", regYAI);
}
Object* Create(const string& class_id) {
auto it = registrList.find(class_id);
if (it != registrList.end()) {
return it->second();
} else {
return nullptr;
}
}
void Register(const string& class_id, Object* (*instance_creator)()) {
registrList.insert({ class_id, instance_creator });
}
};