#include <string>
#include <map>
using std::map;
using std::string;

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

class ChildObject : public Object {
 private:
    string class_id;
 public:
    explicit ChildObject(string class_id) : class_id(class_id) {}
    string ToString() const {
        return class_id;
    }
};

Object* regApple() { return new ChildObject("apple!"); }
Object* regList() { return new ChildObject("list"); }
Object* regYAI() { return new ChildObject("yet another identifier"); }

class Factory {
 private:
    map<string, Object* (*) ()> registrList;
 public:
    Factory() {
        Register("apple!", regApple);
        Register("list", regList);
        Register("yet another identifier", regYAI);
    }
    Object* Create(const string& class_id) {
        auto it = registrList.find(class_id);
        if (it != registrList.end()) {
            return it->second();
        } else {
            return nullptr;
        }
    }
    void Register(const string& class_id, Object* (*instance_creator)()) {
        registrList.insert({ class_id, instance_creator });
    }
};