#pragma once #include #include #include 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 YetAnother : public Object { public: std::string ToString() const override { return "yet another identifier"; } }; class Factory { public: Object *Create(const std::string &class_id) { if (class_id == "apple!") { return new Apple; } else if (class_id == "list") { return new List; } else if (class_id == "yet another identifier") { return new YetAnother; } else { return classes_id[class_id](); } } void Register(const std::string &class_id, Object *(*instance_creator)()) { classes_id[class_id] = instance_creator; } private: std::map> classes_id; };