#include #include #include #include class Object { public: virtual std::string ToString() const = 0; virtual ~Object() {} }; class Smth1 : public Object { public: explicit Smth1(const std::string &class_id) { class_id_ = class_id; } std::string ToString() const override { return class_id_; } private: std::string class_id_; }; Object *NewSomeObject(const std::string &class_id) { return new Smth1(class_id); } class Factory { public: void Register(const std::string &class_id, Object *(*instance_creator)()) { this->id.push_back(class_id); this->funcs.push_back(instance_creator); } Object *Create(const std::string &basicString) { for (const auto &i : this->std_id) { if (i == basicString) { return NewSomeObject(basicString); } } for (unsigned int i = 0; i < this->id.size(); i++) { if (this->id[i] == basicString) { return this->funcs[i](); } } return {}; } private: std::vector std_id{"list", "apple!", "yet another identifier"}; std::vector id; std::vector funcs; };