feat: Abstract Factory
Implemented a demo for the Abstract Factory.
This commit is contained in:
parent
91a28ec137
commit
29102983de
62
03_abstract_factory.cpp
Normal file
62
03_abstract_factory.cpp
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#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);
|
||||||
|
}
|
||||||
6
notes.md
6
notes.md
@ -11,3 +11,9 @@
|
|||||||
工厂模式给出了解决方案。对于每个新的子类,有一个专门的工厂类生成这个新的子类,进而工厂类可以使用不同的参数构建新的子类。
|
工厂模式给出了解决方案。对于每个新的子类,有一个专门的工厂类生成这个新的子类,进而工厂类可以使用不同的参数构建新的子类。
|
||||||
|
|
||||||
工厂模式相对简单工厂,通过解耦获取工厂和生成子类实例,获取了更大的灵活性。比如客户端可以在得到工厂后,进一步根据工厂类型向用户请求输入。但是对于一个新类就需要额外需要一个工厂,稍微麻烦些。通过同时使用两种方式,可以达到最大的灵活性。
|
工厂模式相对简单工厂,通过解耦获取工厂和生成子类实例,获取了更大的灵活性。比如客户端可以在得到工厂后,进一步根据工厂类型向用户请求输入。但是对于一个新类就需要额外需要一个工厂,稍微麻烦些。通过同时使用两种方式,可以达到最大的灵活性。
|
||||||
|
|
||||||
|
## 抽象工厂(Abstract Factory)
|
||||||
|
|
||||||
|
抽象工厂进一步的将工厂本身也作为一种产品。它定义了一个“工厂族”的接口,规定了工厂需要生产哪些种类的产品。客户端从抽象工厂获取一个具体的工厂,再从这个工厂中制造一组相互关联的具体产品。
|
||||||
|
|
||||||
|
这可以用于创建一系列相关或相互依赖的对象,而不指定它们的具体类。也就是说,它解决了产品族一致性的问题。这在组件风格切换、平台适配、多模块协作等方面很有用。
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user