#include <iostream>
#include <string>
#include <map>
#include <functional>

using std::string;
using std::cout;
using std::cin;
using std::vector;
using std::endl;
using std::map;

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

    virtual ~Object() = default;
};

class Apple : public Object {
 public:
    string ToString() const override {
        return "apple!";
    }
};

class List : public Object {
 public:
    string ToString() const override {
        return "list";
    }
};

class YetAnotherId : public Object {
 public:
    string ToString() const override {
        return "yet another identifier";
    }
};

class Factory {
 public:
    Object *Create(const string &class_id) {
        if (class_id == "apple!") {
            return new Apple;
        } else if (class_id == "list") {
            return new List;
        } else if (class_id == "yet another identifier") {
            return new YetAnotherId;
        } else {
            for (auto const& element : info)
                keys.push_back(element.first);
            return info[class_id]();
        }
    }
    void Register(const string &class_id, Object *(*creator)()) {
        info[class_id] = creator;
    }
 private:
    map <string, std::function<Object*()>> info;
};