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