#include <iostream>
#include <string>
#include <memory>
#include <vector>
class IProduct {
public:
virtual std::string Name() = 0;
virtual bool Say() = 0;
virtual ~IProduct() {}
};
using Product = std::shared_ptr<IProduct>;
class IFactory {
public:
Product Create(const std::string& owner) {
Product p = CreateClass(owner);
RegisterClass(p);
return p;
}
virtual ~IFactory() {}
protected:
virtual Product CreateClass(const std::string&) = 0;
virtual void RegisterClass(Product p) = 0;
};
class A : public IProduct {
std::string owner;
public:
A(const std::string& owner) {
this->owner = owner;
}
std::string Name() {
return owner;
}
bool Say() {
std::cout << "Baw " << X << std::endl;
return true;
}
private:
int X = 123;
};
class B : public IProduct {
std::string owner;
public:
B(const std::string& owner) {
this->owner = owner;
}
std::string Name() {
return owner;
}
bool Say() {
std::cout << "Maw " << X << std::endl;
return true;
}
protected:
char X = 'b';
};
class ClassFactory : public IFactory {
std::vector<std::string> owners;
protected:
Product CreateClass(const std::string& owner) {
if (owner == "A")
return std::make_shared<A>(owner);
else if (owner == "B")
return std::make_shared<B>(owner);
else
return nullptr;
}
void RegisterClass(Product p) {
owners.push_back(p->Name());
}
};
int main()
{
auto factory = std::make_shared<ClassFactory>();
auto x = factory->Create("A");
std::cout << x->Name() << std::endl;
std::cout << std::boolalpha << x->Say() << std::endl;
auto y = factory->Create("B");
std::cout << y->Name() << std::endl;
std::cout << std::boolalpha << y->Say() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgSVByb2R1Y3QgewpwdWJsaWM6CiAgdmlydHVhbCBzdGQ6OnN0cmluZyBOYW1lKCkgPSAwOwogIHZpcnR1YWwgYm9vbCBTYXkoKSA9IDA7CiAgdmlydHVhbCB+SVByb2R1Y3QoKSB7fQp9OwoKdXNpbmcgUHJvZHVjdCA9IHN0ZDo6c2hhcmVkX3B0cjxJUHJvZHVjdD47CgpjbGFzcyBJRmFjdG9yeSB7CnB1YmxpYzoKICBQcm9kdWN0IENyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYgb3duZXIpIHsKICAgIFByb2R1Y3QgcCA9IENyZWF0ZUNsYXNzKG93bmVyKTsKICAgIFJlZ2lzdGVyQ2xhc3MocCk7CiAgICByZXR1cm4gcDsKICB9CiAgdmlydHVhbCB+SUZhY3RvcnkoKSB7fQpwcm90ZWN0ZWQ6CiAgdmlydHVhbCBQcm9kdWN0IENyZWF0ZUNsYXNzKGNvbnN0IHN0ZDo6c3RyaW5nJikgPSAwOwogIHZpcnR1YWwgdm9pZCBSZWdpc3RlckNsYXNzKFByb2R1Y3QgcCkgPSAwOwp9OwoKY2xhc3MgQSA6IHB1YmxpYyBJUHJvZHVjdCB7CiAgc3RkOjpzdHJpbmcgb3duZXI7CnB1YmxpYzoKICBBKGNvbnN0IHN0ZDo6c3RyaW5nJiBvd25lcikgewogICAgdGhpcy0+b3duZXIgPSBvd25lcjsKICB9CiAgc3RkOjpzdHJpbmcgTmFtZSgpIHsKICAgIHJldHVybiBvd25lcjsKICB9CiAgYm9vbCBTYXkoKSB7CiAgICBzdGQ6OmNvdXQgPDwgIkJhdyAiIDw8IFggPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIHRydWU7CiAgfQpwcml2YXRlOgogIGludCBYID0gMTIzOwp9OwoKY2xhc3MgQiA6IHB1YmxpYyBJUHJvZHVjdCB7CiAgc3RkOjpzdHJpbmcgb3duZXI7CnB1YmxpYzoKICBCKGNvbnN0IHN0ZDo6c3RyaW5nJiBvd25lcikgewogICAgdGhpcy0+b3duZXIgPSBvd25lcjsKICB9CiAgc3RkOjpzdHJpbmcgTmFtZSgpIHsKICAgIHJldHVybiBvd25lcjsKICB9CiAgYm9vbCBTYXkoKSB7CiAgICBzdGQ6OmNvdXQgPDwgIk1hdyAiIDw8IFggPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIHRydWU7CiAgfQpwcm90ZWN0ZWQ6CiAgY2hhciBYID0gJ2InOwp9OwoKY2xhc3MgQ2xhc3NGYWN0b3J5IDogcHVibGljIElGYWN0b3J5IHsKICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3duZXJzOwpwcm90ZWN0ZWQ6CiAgUHJvZHVjdCBDcmVhdGVDbGFzcyhjb25zdCBzdGQ6OnN0cmluZyYgb3duZXIpIHsKICAgIGlmIChvd25lciA9PSAiQSIpCiAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEE+KG93bmVyKTsKICAgIGVsc2UgaWYgKG93bmVyID09ICJCIikKICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Qj4ob3duZXIpOwogICAgZWxzZQogICAgICByZXR1cm4gbnVsbHB0cjsKICB9CiAgdm9pZCBSZWdpc3RlckNsYXNzKFByb2R1Y3QgcCkgewogICAgb3duZXJzLnB1c2hfYmFjayhwLT5OYW1lKCkpOwogIH0KfTsKCmludCBtYWluKCkKewogIGF1dG8gZmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2xhc3NGYWN0b3J5PigpOwoKICBhdXRvIHggPSBmYWN0b3J5LT5DcmVhdGUoIkEiKTsKICBzdGQ6OmNvdXQgPDwgeC0+TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKICBzdGQ6OmNvdXQgPDwgc3RkOjpib29sYWxwaGEgPDwgeC0+U2F5KCkgPDwgc3RkOjplbmRsOwoKICBhdXRvIHkgPSBmYWN0b3J5LT5DcmVhdGUoIkIiKTsKICBzdGQ6OmNvdXQgPDwgeS0+TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKICBzdGQ6OmNvdXQgPDwgc3RkOjpib29sYWxwaGEgPDwgeS0+U2F5KCkgPDwgc3RkOjplbmRsOwp9Cg==