#include <string>
#include <map>
#include <utility>
class Object {
public:
virtual std::string ToString() const = 0;
virtual ~Object() = default;
};
class Object_N : public Object {
private:
std::string s_id;
public:
explicit Object_N(std::string s_i) {
s_id = std::move(s_i);
}
std::string ToString() const override {
return s_id;
}
};
class Factory {
private:
std::map<std::string, std::function<Object *()>> mode_fun;
public:
void Register(const std::string &class_id,
class Object *(*instance_creator)()) {
mode_fun[class_id] = instance_creator;
}
class Object *Create(const std::string &class_id) {
if (mode_fun.count(class_id)) {
return mode_fun[class_id]();
} else {
return new Object_N(class_id);
}
}
};