#include #include #include using std::string; using std::map; class Object { public: virtual string ToString() const = 0; virtual ~Object() {} }; class Apple: public Object { string ToString() const override { return "apple!"; } }; class List: public Object { string ToString() const override { return "list"; } }; class YAI : public Object { string ToString() const override { return "yet another identifier"; } }; class Factory { private: map functions; public: Object* Create(const 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 string& class_id, Object*(*instance_creator)()) { functions[class_id] = instance_creator; } };