#include <map>
#include <string>

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

class Smth1 : public Object {
 public:
    explicit Smth1(const std::string& class_id) {
        class_id_ = class_id;
    }

    std::string ToString() const override {
        return class_id_;
    }
 private:
    std::string class_id_;
};

Object* my_new_smth_1(std::string class_id) {
    return new Smth1(class_id);
}


std::map<std::string, Object*(*)()> registered;

class Factory {
 public:
    void Register(const std::string& class_id, Object*(*instance_creator)()) {
        registered[class_id] = instance_creator;
    }
    Object* Create(const std::string& class_id){
        if (class_id != "apple!"&&class_id!="list" && 
        class_id != "yet another identifier") {
            return registered[class_id]();
        } else {
            return my_new_smth_1(class_id);
        }
    }
};