#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);
    }
  }
};