#pragma once #include const char* ci; class Object { public: virtual std::string ToString() const = 0; virtual ~Object() {} }; class apple : public Object{ public: std::string ToString() const { return "apple!"; }; }; class list : public Object { public: std::string ToString() const { return "list"; }; }; class yai : public Object { public: std::string ToString() const { return "yet another identifier"; }; }; class dif : public Object { public: dif() { } std::string id_; explicit dif(std::string id_) { this->id_ = id_; } std::string ToString() const { return id_; }; }; class Factory { public: Object* Create(std::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; else return new dif(ci); } void Register(const std::string& class_id, Object* (*instance_creator)()) { ci = class_id.c_str(); } };