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

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

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

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

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

class yai : public Object {
  [[nodiscard]] std::string ToString() const override {
    return "yet another identifier";
  }
};

class Factory {
 private:
  map<string, Object*(*)()> functions;
 public:
  Object* Create (const std::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 std::string& class_id, Object*(*instance_creator)()) {
    functions[class_id] = instance_creator;
  }
};