#include <string>
#include <vector>
#include <utility>

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

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

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

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

class Factory {
    std::vector<std::pair<std::string, Object*(*)()>> vec;

 public:
    Object* Create(const std::string& class_id) {
        Object* obj = nullptr;
        if (class_id == "apple!") {
            obj = new Apple();
        } else if (class_id == "list") {
            obj = new List();
        } else if (class_id == "yet another identifier") {
            obj = new Another();
        } else {
            for (auto i : vec) {
                if (i.first == class_id) {
                    obj = i.second();
                    break;
                }
            }
        }
        return obj;
    }
    void Register(const std::string& class_id, Object*(*instance_creator)()) {
        vec.push_back({class_id, instance_creator});
    }
};