C++中的抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口,用来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。通过抽象工厂模式,客户端可以通过工厂接口获取一系列产品的实例,而不需要知道它们的具体类。
抽象工厂模式的结构
- AbstractFactory(抽象工厂):声明了创建抽象产品的方法。
- ConcreteFactory(具体工厂):实现了创建具体产品的方法。
- AbstractProduct(抽象产品):为每种产品声明一个接口。
- ConcreteProduct(具体产品):实现了抽象产品接口的具体产品。
- Client(客户端):只依赖于抽象工厂和抽象产品,而无需了解具体类。
示例代码
假设我们在设计一个UI框架,要支持不同操作系统(Windows和Mac)的UI元素。
1. 定义抽象产品
// 抽象按钮类
class Button {
public:
virtual void render() = 0;
virtual ~Button() = default;
};
// 抽象复选框类
class Checkbox {
public:
virtual void render() = 0;
virtual ~Checkbox() = default;
};
2. 定义具体产品
// 具体Windows按钮类
class WindowsButton : public Button {
public:
void render() override {
std::cout << "Rendering Windows Button" << std::endl;
}
};
// 具体Windows复选框类
class WindowsCheckbox : public Checkbox {
public:
void render() override {
std::cout << "Rendering Windows Checkbox" << std::endl;
}
};
// 具体Mac按钮类
class MacButton : public Button {
public:
void render() override {
std::cout << "Rendering Mac Button" << std::endl;
}
};
// 具体Mac复选框类
class MacCheckbox : public Checkbox {
public:
void render() override {
std::cout << "Rendering Mac Checkbox" << std::endl;
}
};
3. 定义抽象工厂
class GUIFactory {
public:
virtual Button* createButton() = 0;
virtual Checkbox* createCheckbox() = 0;
virtual ~GUIFactory() = default;
};
4. 定义具体工厂
// Windows工厂
class WindowsFactory : public GUIFactory {
public:
Button* createButton() override {
return new WindowsButton();
}
Checkbox* createCheckbox() override {
return new WindowsCheckbox();
}
};
// Mac工厂
class MacFactory : public GUIFactory {
public:
Button* createButton() override {
return new MacButton();
}
Checkbox* createCheckbox() override {
return new MacCheckbox();
}
};
5. 客户端代码
void renderUI(GUIFactory* factory) {
Button* button = factory->createButton();
Checkbox* checkbox = factory->createCheckbox();
button->render();
checkbox->render();
delete button;
delete checkbox;
}
int main() {
GUIFactory* factory;
// 创建Windows的UI元素
factory = new WindowsFactory();
renderUI(factory);
delete factory;
// 创建Mac的UI元素
factory = new MacFactory();
renderUI(factory);
delete factory;
return 0;
}
输出
Rendering Windows Button
Rendering Windows Checkbox
Rendering Mac Button
Rendering Mac Checkbox
总结
- 抽象工厂模式通过创建一个工厂接口来生成相关的产品族(如UI元素),每个具体工厂根据操作系统(Windows、Mac等)来创建适当的产品对象。
- 客户端不直接依赖具体产品类,而是通过工厂接口获取需要的产品实例,这样可以保持产品的独立性和扩展性。