feat: Abstract Factory

Implemented a demo for the Abstract Factory.
This commit is contained in:
Yuki 2025-04-05 17:33:21 +08:00
parent 91a28ec137
commit 29102983de
Signed by: yuki
GPG Key ID: CF40579331C06C73
2 changed files with 68 additions and 0 deletions

62
03_abstract_factory.cpp Normal file
View 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);
}

View File

@ -11,3 +11,9 @@
工厂模式给出了解决方案。对于每个新的子类,有一个专门的工厂类生成这个新的子类,进而工厂类可以使用不同的参数构建新的子类。 工厂模式给出了解决方案。对于每个新的子类,有一个专门的工厂类生成这个新的子类,进而工厂类可以使用不同的参数构建新的子类。
工厂模式相对简单工厂,通过解耦获取工厂和生成子类实例,获取了更大的灵活性。比如客户端可以在得到工厂后,进一步根据工厂类型向用户请求输入。但是对于一个新类就需要额外需要一个工厂,稍微麻烦些。通过同时使用两种方式,可以达到最大的灵活性。 工厂模式相对简单工厂,通过解耦获取工厂和生成子类实例,获取了更大的灵活性。比如客户端可以在得到工厂后,进一步根据工厂类型向用户请求输入。但是对于一个新类就需要额外需要一个工厂,稍微麻烦些。通过同时使用两种方式,可以达到最大的灵活性。
## 抽象工厂Abstract Factory
抽象工厂进一步的将工厂本身也作为一种产品。它定义了一个“工厂族”的接口,规定了工厂需要生产哪些种类的产品。客户端从抽象工厂获取一个具体的工厂,再从这个工厂中制造一组相互关联的具体产品。
这可以用于创建一系列相关或相互依赖的对象,而不指定它们的具体类。也就是说,它解决了产品族一致性的问题。这在组件风格切换、平台适配、多模块协作等方面很有用。