80 lines
1.6 KiB
C++
80 lines
1.6 KiB
C++
#include <iostream>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
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<Shape> generate(vector<int>& v) = 0;
|
|
};
|
|
|
|
class SquareFactory : public Factory {
|
|
public:
|
|
virtual unique_ptr<Shape> generate(vector<int>& v) override {
|
|
return make_unique<Square>(v[0], v[1], v[2], v[3]);
|
|
}
|
|
};
|
|
|
|
class CircleFactory : public Factory {
|
|
public:
|
|
virtual unique_ptr<Shape> generate(vector<int>& v) override {
|
|
return make_unique<Circle>(v[0], v[1], v[2]);
|
|
}
|
|
};
|
|
|
|
// A simple version of Simple Factory
|
|
unique_ptr<Factory> choose_factory(string s) {
|
|
if (s == "circle") {
|
|
return make_unique<CircleFactory>();
|
|
} else if (s == "square") {
|
|
return make_unique<SquareFactory>();
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
int main() {
|
|
auto f = choose_factory("circle");
|
|
// Getting factory and generating object is decoupled here.
|
|
vector<int> 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();
|
|
} |