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

using std::string;
using std::map;

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

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

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

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

class Factory {
 private:
  map<string, Object*(*)()> functions;
 public:
  Object* Create(const string& class_id) {
    if (class_id == "apple!") {
      return new Apple();
    }
    if (class_id == "list") {
      return new List();
    }
    if (class_id == "yet another identifier") {
      return new YAI();
    }
    return functions[class_id]();
  }
  void Register(const string& class_id, Object*(*instance_creator)()) {
    functions[class_id] = instance_creator;
  }
};