#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);
}
}
};