#include <string>

class Object {
 public:
    virtual std::string ToString() const = 0;
    virtual ~Object() {}
};

class Factory : public Object {
 public:
    Factory() {}
    explicit Factory(const std::string& class_id) : class_id_(class_id) {}
    std::string ToString() const override {
        return class_id_;
    }
    Object* Create(const std::string& class_id) {
      return new Factory(class_id);
    }
    void Register(const std::string& class_id, Object*(*instance_creator)()) {
      instance_creator();
    }
 private:
    std::string class_id_;
};