#pragma once #include #include #include class Object { public: virtual std::string ToString() const = 0; virtual ~Object() {}; }; class DeusExCondition : public Object { public: std::string ID; DeusExCondition(const std::string& ID) : ID(ID) {} std::string ToString() const { return ID; } }; Object* new_list() { return new DeusExCondition("list"); } Object* new_apple() { return new DeusExCondition("apple!"); } Object* new_yet() { return new DeusExCondition("yet another identifier"); } class Factory { public: std::map> ex_machina; Factory() { ex_machina.insert(std::make_pair("list", new_list)); ex_machina.insert(std::make_pair("apple!", new_apple)); ex_machina.insert(std::make_pair("yet another identifier", new_yet)); } Object* Create(const std::string& ID) { auto it = ex_machina.find(ID); if (it != ex_machina.end()) { return it->second(); } else { return nullptr; } } void Register(const std::string ID, Object*(*deus_ex)()) { if (ex_machina.find(ID) == ex_machina.end()) { ex_machina.insert(std::make_pair(ID, deus_ex)); } } };