3、跟学23种设计模式(C++版):抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而无需明确指定具体类。这种模式使得客户端可以使用抽象接口创建一组相关的对象,而无需关心它们的具体实现。

  • 特点

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、 抽象产品ButtonTextBox是两个抽象产品,它们定义了具体产品必须实现的接口;
2、 具体产品WindowsButton,MacButton,WindowsTextBox,MacTextBox是四个具体产品,实现了各自的抽象接口;
3、 抽象工厂GUIFactory是抽象工厂,声明了创建抽象产品的方法;
4、 具体工厂WindowsFactoryMacFactory是两个具体工厂,实现了抽象工厂接口,用于创建具体的产品对象;
5、 客户端代码createUI函数接受一个抽象工厂对象,通过它创建并使用具体产品对象,而无需知道这些产品的具体类;

通过抽象工厂这种模式,客户端代码可以独立于具体产品类,灵活地切换不同风格的产品族。

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: