抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。它对客户端代码隐藏了实现细节,客户端不用关心某一系列产品的具体名称。客户端只知道这一系列产品中的具体产品的共同行为。而且它也只关心共同行为。
考虑全屋定制家具场景:一个家庭都需要沙发、椅子、桌子等等家具。客户偏好的风格可能是不同的,有的客户喜欢西式,有的客户喜欢中式。西式和中式的沙发、椅子、桌子是不同风格。现在要根据客户不同的偏好创建不同的沙发、椅子等。这时就适合抽象工厂模式发挥作用。
如果不使用抽象工厂,会怎么做呢?
```伪代码 如果客户喜欢中式 创建中式沙发 创建中式椅子 创建中式桌子 如果客户喜欢西式 创建西式沙发 创建西式椅子 创建西式桌子 ···
#### 使用抽象工厂
```伪代码
如果客户喜欢中式
创建中式工厂
如果客户喜欢西式工厂
创建西式工厂
···
工厂创建沙发
工厂创建椅子
工厂创建桌子
如果增加一种风格,客户相关的代码只需要增加客户偏好的判断即可,其他增加新的类就好。如果突然流行苏州中式风格的家具。客户端代码不用动,只需修改中式工厂代码即可。
类图
![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