#include #include 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 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 }); } };