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