63 lines
1.1 KiB
C++
63 lines
1.1 KiB
C++
#include <iostream>
|
|
#include <memory>
|
|
|
|
using namespace std;
|
|
|
|
class Table {
|
|
public:
|
|
virtual void show() = 0;
|
|
};
|
|
|
|
class ATable : public Table {
|
|
public:
|
|
virtual void show() {
|
|
cout << "Atable" << endl;
|
|
}
|
|
};
|
|
|
|
class Chair {
|
|
public:
|
|
virtual void show() = 0;
|
|
};
|
|
|
|
class AChair : public Chair {
|
|
public:
|
|
virtual void show() {
|
|
cout << "Achair" << endl;
|
|
}
|
|
};
|
|
|
|
|
|
class FurnitureFactory {
|
|
public:
|
|
virtual unique_ptr<Chair> build_chair() = 0;
|
|
virtual unique_ptr<Table> build_table() = 0;
|
|
};
|
|
|
|
// A concrete Factury will create the same style of objects.
|
|
class AFurnitureFactory : public FurnitureFactory {
|
|
public:
|
|
virtual unique_ptr<Chair> build_chair() override {
|
|
return make_unique<AChair>();
|
|
}
|
|
|
|
virtual unique_ptr<Table> build_table() override {
|
|
return make_unique<ATable>();
|
|
}
|
|
};
|
|
|
|
// Client code, which don't need to care the style of furniture.
|
|
void operate(FurnitureFactory* ff) {
|
|
unique_ptr<Chair> c = ff->build_chair();
|
|
unique_ptr<Table> t = ff->build_table();
|
|
c->show();
|
|
t->show();
|
|
}
|
|
|
|
|
|
int main() {
|
|
AFurnitureFactory a;
|
|
// Of course you can extend BFF, CFF
|
|
operate(&a);
|
|
}
|