抽象工厂模式

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。它对客户端代码隐藏了实现细节,客户端不用关心某一系列产品的具体名称。客户端只知道这一系列产品中的具体产品的共同行为。而且它也只关心共同行为。

考虑全屋定制家具场景:一个家庭都需要沙发、椅子、桌子等等家具。客户偏好的风格可能是不同的,有的客户喜欢西式,有的客户喜欢中式。西式和中式的沙发、椅子、桌子是不同风格。现在要根据客户不同的偏好创建不同的沙发、椅子等。这时就适合抽象工厂模式发挥作用。

如果不使用抽象工厂,会怎么做呢?

```伪代码 如果客户喜欢中式 创建中式沙发 创建中式椅子 创建中式桌子 如果客户喜欢西式 创建西式沙发 创建西式椅子 创建西式桌子 ···

#### 使用抽象工厂
```伪代码
如果客户喜欢中式
   创建中式工厂
如果客户喜欢西式工厂
   创建西式工厂
···
工厂创建沙发
工厂创建椅子
工厂创建桌子

如果增加一种风格,客户相关的代码只需要增加客户偏好的判断即可,其他增加新的类就好。如果突然流行苏州中式风格的家具。客户端代码不用动,只需修改中式工厂代码即可。

类图

![2024-01-07T23:31:26.png][1]

示例代码

```c++

include

// 1. 抽象产品 - 沙发 class Sofa { public: virtual void sit() const = 0; };

// 2. 具体产品 - 西式沙发 class WesternSofa : public Sofa { public: void sit() const override { std::cout << "Sitting on Western Sofa" << std::endl; } };

// 3. 具体产品 - 中式沙发 class ChineseSofa : public Sofa { public: void sit() const override { std::cout << "Sitting on Chinese Sofa" << std::endl; } };

// 4. 抽象产品 - 椅子 class Chair { public: virtual void sit() const = 0; };

// 5. 具体产品 - 西式椅子 class WesternChair : public Chair { public: void sit() const override { std::cout << "Sitting on Western Chair" << std::endl; } };

// 6. 具体产品 - 中式椅子 class ChineseChair : public Chair { public: void sit() const override { std::cout << "Sitting on Chinese Chair" << std::endl; } };

// 7. 抽象产品 - 桌子 class Table { public: virtual void eat() const = 0; };

// 8. 具体产品 - 西式桌子 class WesternTable : public Table { public: void eat() const override { std::cout << "Eating on Western Table" << std::endl; } };

// 9. 具体产品 - 中式桌子 class ChineseTable : public Table { public: void eat() const override { std::cout << "Eating on Chinese Table" << std::endl; } };

// 10. 抽象工厂 class FurnitureFactory { public: virtual Sofa createSofa() const = 0; virtual Chair createChair() const = 0; virtual Table* createTable() const = 0; };

// 11. 具体工厂 - 西式家具工厂 class WesternFurnitureFactory : public FurnitureFactory { public: Sofa* createSofa() const override { return new WesternSofa(); }

Chair* createChair() const override {
    return new WesternChair();
}

Table* createTable() const override {
    return new WesternTable();
}

};

// 12. 具体工厂 - 中式家具工厂 class ChineseFurnitureFactory : public FurnitureFactory { public: Sofa* createSofa() const override { return new ChineseSofa(); }

Chair* createChair() const override {
    return new ChineseChair();
}

Table* createTable() const override {
    return new ChineseTable();
}

};

int main() { // 使用抽象工厂创建家具实例 int preference = 0 FurnitureFactory* factory; if preference == 1 { //中式 factory = new ChineseFurnitureFactory(); } else if preference == 2 { //西式 factory = new WesternFurnitureFactory(); }

Sofa* sofa = factory->createSofa();
Chair* chair = factory->createChair();
Table* table = factory->createTable();

// 使用家具
sofa->sit();
chair->sit();
table->eat();

// 释放资源
delete factory;
delete sofa;
delete chair;
delete table;

return 0;

}



  [1]: https://lcslearn.top/usr/uploads/2024/01/1307602938.png