#pragma once #include #include #include class Object { public: virtual std::string ToString() const = 0; virtual ~Object() {} }; class Apple : public Object { public: explicit Apple(const std::string& class_id) : class_id_(class_id) {} std::string ToString() const override { return class_id_; } private: const std::string class_id_; }; class List : public Object { public: explicit List(const std::string& class_id) : class_id_(class_id) {} std::string ToString() const override { return class_id_; } private: const std::string class_id_; }; class YetAnotherIdentifier : public Object { public: explicit YetAnotherIdentifier(const std::string& class_id) : class_id_(class_id) {} std::string ToString() const override { return class_id_; } private: const std::string class_id_; }; class Factory { public: Object* Create(const std::string& class_id) { if (class_id == "apple!") { return new Apple(class_id); } else if (class_id == "list") { return new List(class_id); } else if (class_id == "yet another identifier") { return new YetAnotherIdentifier(class_id); } else { return create_another_functions[class_id](); } } void Register(const std::string& class_id, Object*(*instance_creator)()) { create_another_functions[class_id] = instance_creator; } private: std::map> create_another_functions; };