#include #include #include using namespace std; class Shape { public: virtual void draw() = 0; virtual ~Shape() {}; }; class Circle : public Shape { int x; int y; int r; public: Circle(int x, int y, int r) : x(x), y(y), r(r) {} virtual void draw() { cout << "draw circle: " << x << " " << y << " " << r << endl; } }; class Square : public Shape{ int x1; int y1; int x2; int y2; public: Square(int x1, int y1, int x2, int y2) : x1(x1), y1(y1), x2(x2), y2(y2) {} virtual void draw() { cout << "draw square: " << x1 << " " << y1 << " " << x2 << " " << y2 << endl; } }; class Factory { public: virtual unique_ptr generate(vector& v) = 0; }; class SquareFactory : public Factory { public: virtual unique_ptr generate(vector& v) override { return make_unique(v[0], v[1], v[2], v[3]); } }; class CircleFactory : public Factory { public: virtual unique_ptr generate(vector& v) override { return make_unique(v[0], v[1], v[2]); } }; // A simple version of Simple Factory unique_ptr choose_factory(string s) { if (s == "circle") { return make_unique(); } else if (s == "square") { return make_unique(); } return nullptr; } int main() { auto f = choose_factory("circle"); // Getting factory and generating object is decoupled here. vector v = {1, 2, 3}; auto s = f->generate(v); s->draw(); f = choose_factory("square"); v.push_back(4); s = f->generate(v); s->draw(); }