抽象工厂设计模式 (Abstract Factory Pattern)
意图:提供创建相关或依赖对象家族的接口,无需指定具体类。
基础组件
- AbstractFactory (抽象工厂):声明创建产品族的方法
- ConcreteFactory (具体工厂):实现创建具体产品的方法
- AbstractProductA/B (抽象产品):声明产品接口
- ConcreteProductA/B (具体产品):实现特定产品
继承/实现关系
AbstractFactory <|-- ConcreteFactory
AbstractProductA <|-- ConcreteProductA1
AbstractProductA <|-- ConcreteProductA2
AbstractProductB <|-- ConcreteProductB1
AbstractProductB <|-- ConcreteProductB2
ConcreteFactory --> ConcreteProductA1 (创建)
ConcreteFactory --> ConcreteProductB1 (创建)
应用场景
- 系统需要独立于产品创建方式
- 需要确保产品兼容性
- 产品家族需要一起使用
C++ 实现(UI 组件场景)
#include <iostream>
#include <memory>
/*
* 抽象工厂模式
* 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
* 基础组件:
* - AbstractFactory (抽象工厂):声明创建产品族的方法
* - ConcreteFactory (具体工厂):实现创建具体产品的方法
* - AbstractProductA/B (抽象产品):声明产品接口
* - ConcreteProductA/B (具体产品):实现特定产品
* 继承/实现关系:
* ConcreteFactory 实现 AbstractFactory,并创建具体产品实例。
* ConcreteProductA/B 实现 AbstractProductA/B 接口。
* ConcreteFactory 的方法返回具体产品实例。
*/
// 抽象按钮产品
class Button {
public:
virtual void paint() = 0;
virtual ~Button() = default;
};
// 抽象文本框产品
class TextBox {
public:
virtual void draw() = 0;
virtual ~TextBox() = default;
};
// 具体按钮产品:Windows 风格按钮
class WinButton : public Button {
public:
void paint() override {
std::cout << "Windows style button\n";
}
};
// Mac 按钮
class MacButton : public Button {
public:
void paint() override {
std::cout << "macOS style button\n";
}
};
// Windows 文本框
class WinTextBox : public TextBox {
public:
void draw() override {
std::cout << "Windows textbox\n";
}
};
// Mac 文本框
class MacTextBox : public TextBox {
public:
void draw() override {
std::cout << "macOS textbox\n";
}
};
// 抽象工厂
class GUIFactory {
public:
virtual std::unique_ptr<Button> createButton() = 0;
virtual std::unique_ptr<TextBox> createTextBox() = 0;
virtual ~GUIFactory() = default;
};
// Windows 工厂
class WinFactory : public GUIFactory {
public:
std::unique_ptr<Button> createButton() override {
return std::make_unique<WinButton>();
}
std::unique_ptr<TextBox> createTextBox() override {
return std::make_unique<WinTextBox>();
}
};
// Mac 工厂
class MacFactory : public GUIFactory {
public:
std::unique_ptr<Button> createButton() override {
return std::make_unique<MacButton>();
}
std::unique_ptr<TextBox> createTextBox() override {
return std::make_unique<MacTextBox>();
}
};
void AbstractFactoryPattern()
{
std::cout << std::string(9, '-') << " Abstract Factory Pattern " << std::string(9, '-') << std::endl;
std::unique_ptr<GUIFactory> factory = std::make_unique<MacFactory>();
std::unique_ptr<Button> button = factory->createButton();
std::unique_ptr<TextBox> textBox = factory->createTextBox();
button->paint();
textBox->draw();
}
组件对应关系
GUIFactory→ 抽象工厂WinFactory/MacFactory→ 具体工厂Button/TextBox→ 抽象产品WinButton/MacButton/WinTextBox/MacTextBox→ 具体产品

1002

被折叠的 条评论
为什么被折叠?



