#ifndef FACTORY_FACTORY_H
#define FACTORY_FACTORY_H
#pragma once
#include <string>
#include <map>
#include <vector>
class Object {
public:
virtual std::string ToString() const = 0;
virtual ~Object() {}
};
class ObjectChild : public Object {
private:
std::string id;
public:
explicit ObjectChild(std::string id_name) : id(id_name) {}
virtual std::string ToString() const {
return id;
}
};
class Factory {
private:
std::map<std::string, Object *(*)()> containers_new;
std::vector<std::string> containers_standart;
public:
Factory() {
containers_standart.push_back("apple!");
containers_standart.push_back("list");
containers_standart.push_back("yet another identifier");
}
Object *Create(const std::string &class_id) {
if (containers_new.find(class_id) != containers_new.end()) {
return containers_new[class_id]();
}
for (auto i : containers_standart) {
if (i == class_id)
return new ObjectChild(class_id);
}
return nullptr;
}
void Register(const std::string &class_id, Object *(*instance_creator)()) {
containers_new[class_id] = instance_creator;
}
};
#endif