抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而无需明确指定具体类。这种模式使得客户端可以使用抽象接口创建一组相关的对象,而无需关心它们的具体实现。
-
特点
1、 抽象化创建过程:抽象工厂模式将对象的创建过程抽象化,客户端通过接口来创建对象,而不是直接实例化具体类;
2、 产品族的概念:抽象工厂模式强调的是产品族的概念,即一组相关的产品对象例如,一个GUI库可能包含不同风格(如Windows风格和Mac风格)的按钮、文本框、窗口等;
3、 分离具体类:客户端代码依赖于抽象工厂接口,而不是具体类,这使得系统更具可扩展性和可维护性;
4、 易于交换产品系列:通过使用不同的具体工厂,客户端可以轻松地交换产品系列而不需要修改客户端代码;
-
适用场景
1、 需要创建一系列相关或依赖的对象时:例如,一个GUI库需要创建一系列相关的组件(如按钮、文本框、窗口等);
2、 系统独立于产品的创建和组合时:通过使用抽象工厂,系统可以独立于这些产品的创建和组合过程;
3、 需要提供一个产品类库,而只暴露接口而不暴露具体实现时:这可以提高系统的灵活性和可扩展性;
- 案例演示
这里展示如何使用抽象工厂模式来创建一系列相关的产品对象,以创建不同风格的GUI组件(如按钮和文本框)为例。
#include <iostream>
#include <memory>
// 抽象产品:按钮
class Button {
public:
virtual void paint() = 0;
virtual ~Button() {}
};
// 具体产品:Windows 风格的按钮
class WindowsButton : public Button {
public:
void paint() override {
std::cout << "Painting a Windows style button." << std::endl;
}
};
// 具体产品:Mac 风格的按钮
class MacButton : public Button {
public:
void paint() override {
std::cout << "Painting a Mac style button." << std::endl;
}
};
// 抽象产品:文本框
class TextBox {
public:
virtual void paint() = 0;
virtual ~TextBox() {}
};
// 具体产品:Windows 风格的文本框
class WindowsTextBox : public TextBox {
public:
void paint() override {
std::cout << "Painting a Windows style text box." << std::endl;
}
};
// 具体产品:Mac 风格的文本框
class MacTextBox : public TextBox {
public:
void paint() override {
std::cout << "Painting a Mac style text box." << std::endl;
}
};
// 抽象工厂
class GUIFactory {
public:
virtual std::unique_ptr<Button> createButton() = 0;
virtual std::unique_ptr<TextBox> createTextBox() = 0;
virtual ~GUIFactory() {}
};
// 具体工厂:Windows 风格的工厂
class WindowsFactory : public GUIFactory {
public:
std::unique_ptr<Button> createButton() override {
return std::make_unique<WindowsButton>();
}
std::unique_ptr<TextBox> createTextBox() override {
return std::make_unique<WindowsTextBox>();
}
};
// 具体工厂: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 createUI(std::unique_ptr<GUIFactory> factory) {
auto button = factory->createButton();
auto textBox = factory->createTextBox();
button->paint();
textBox->paint();
}
int main() {
std::unique_ptr<GUIFactory> factory;
// 创建 Windows 风格的 UI
factory = std::make_unique<WindowsFactory>();
createUI(std::move(factory));
// 创建 Mac 风格的 UI
factory = std::make_unique<MacFactory>();
createUI(std::move(factory));
return 0;
}
- 类关系图
- 简要说明
1、 抽象产品:Button
和TextBox
是两个抽象产品,它们定义了具体产品必须实现的接口;
2、 具体产品:WindowsButton
,MacButton
,WindowsTextBox
,MacTextBox
是四个具体产品,实现了各自的抽象接口;
3、 抽象工厂:GUIFactory
是抽象工厂,声明了创建抽象产品的方法;
4、 具体工厂:WindowsFactory
和MacFactory
是两个具体工厂,实现了抽象工厂接口,用于创建具体的产品对象;
5、 客户端代码:createUI
函数接受一个抽象工厂对象,通过它创建并使用具体产品对象,而无需知道这些产品的具体类;
通过抽象工厂这种模式,客户端代码可以独立于具体产品类,灵活地切换不同风格的产品族。
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: