diff --git a/03_abstract_factory.cpp b/03_abstract_factory.cpp new file mode 100644 index 0000000..d0be7f1 --- /dev/null +++ b/03_abstract_factory.cpp @@ -0,0 +1,62 @@ +#include +#include + +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 build_chair() = 0; + virtual unique_ptr build_table() = 0; +}; + +// A concrete Factury will create the same style of objects. +class AFurnitureFactory : public FurnitureFactory { +public: + virtual unique_ptr build_chair() override { + return make_unique(); + } + + virtual unique_ptr
build_table() override { + return make_unique(); + } +}; + +// Client code, which don't need to care the style of furniture. +void operate(FurnitureFactory* ff) { + unique_ptr c = ff->build_chair(); + unique_ptr
t = ff->build_table(); + c->show(); + t->show(); +} + + +int main() { + AFurnitureFactory a; + // Of course you can extend BFF, CFF + operate(&a); +} diff --git a/notes.md b/notes.md index 8aab762..9b854eb 100644 --- a/notes.md +++ b/notes.md @@ -11,3 +11,9 @@ 工厂模式给出了解决方案。对于每个新的子类,有一个专门的工厂类生成这个新的子类,进而工厂类可以使用不同的参数构建新的子类。 工厂模式相对简单工厂,通过解耦获取工厂和生成子类实例,获取了更大的灵活性。比如客户端可以在得到工厂后,进一步根据工厂类型向用户请求输入。但是对于一个新类就需要额外需要一个工厂,稍微麻烦些。通过同时使用两种方式,可以达到最大的灵活性。 + +## 抽象工厂(Abstract Factory) + +抽象工厂进一步的将工厂本身也作为一种产品。它定义了一个“工厂族”的接口,规定了工厂需要生产哪些种类的产品。客户端从抽象工厂获取一个具体的工厂,再从这个工厂中制造一组相互关联的具体产品。 + +这可以用于创建一系列相关或相互依赖的对象,而不指定它们的具体类。也就是说,它解决了产品族一致性的问题。这在组件风格切换、平台适配、多模块协作等方面很有用。