#include <string>
#include <map>
#include <utility>

class Object {
 public:
    [[nodiscard]] 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);
    }

    [[nodiscard]] 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);
        }
    }
};