创建型模式-抽象工厂模式

发布时间 2023-11-10 14:52:08作者: Qt小罗

1 什么是抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定具体的类。抽象工厂模式通过定义一个抽象工厂接口,该接口声明了一组用于创建不同类型对象的工厂方法。每个工厂方法负责创建一种类型的对象,而具体的工厂类则实现了这个接口,负责创建特定类型的对象。

抽象工厂模式适用于需要一次性创建一组相关对象的场景,这些对象之间存在一定的关联关系,且需要保证创建的对象是彼此兼容的。通过使用抽象工厂模式,可以避免客户端代码直接依赖具体类,从而实现了对象的解耦和灵活性。

2 举个例子

假设我们正在开发一个跨平台的界面库,它需要在不同的操作系统上创建相应的按钮和文本框。为了实现界面的跨平台性,我们可以使用抽象工厂模式。

首先,我们定义一个抽象的按钮接口 Button 和一个抽象的文本框接口 Textbox,它们分别声明了按钮和文本框的方法:

class Button {
public:
    virtual void click() const = 0;
    virtual ~Button() {}
};

class Textbox {
public:
    virtual void input() const = 0;
    virtual ~Textbox() {}
};

然后,我们定义一个抽象工厂接口 GUIFactory,其中包含了创建按钮和创建文本框的抽象工厂方法:

class GUIFactory {
public:
    virtual Button* createButton() const = 0;
    virtual Textbox* createTextbox() const = 0;
    virtual ~GUIFactory() {}
};

接下来,我们创建两个具体的按钮类 WindowsButton 和 LinuxButton,它们分别实现了按钮接口:

class WindowsButton : public Button {
public:
    void click() const override {
        cout << "Windows button clicked." << endl;
    }
};

class LinuxButton : public Button {
public:
    void click() const override {
        cout << "Linux button clicked." << endl;
    }
};

然后,我们创建两个具体的文本框类 WindowsTextbox 和 LinuxTextbox,它们分别实现了文本框接口:

class WindowsTextbox : public Textbox {
public:
    void input() const override {
        cout << "Windows textbox input." << endl;
    }
};

class LinuxTextbox : public Textbox {
public:
    void input() const override {
        cout << "Linux textbox input." << endl;
    }
};

最后,我们创建具体的工厂类 WindowsFactory 和 LinuxFactory,它们分别实现了抽象工厂接口,负责创建相应的按钮和文本框对象:

class WindowsFactory : public GUIFactory {
public:
    Button* createButton() const override {
        return new WindowsButton();
    }

    Textbox* createTextbox() const override {
        return new WindowsTextbox();
    }
};

class LinuxFactory : public GUIFactory {
public:
    Button* createButton() const override {
        return new LinuxButton();
    }

    Textbox* createTextbox() const override {
        return new LinuxTextbox();
    }
};

在客户端代码中,我们可以根据当前操作系统选择对应的工厂类,并使用工厂类来创建相应的按钮和文本框对象:

int main() {
    GUIFactory* factory = nullptr; // 根据当前操作系统选择工厂类

    // 创建按钮和文本框
    Button* button = factory->createButton();
    Textbox* textbox = factory->createTextbox();

    // 使用按钮和文本框
    button->click();
    textbox->input();

    // 清理资源
    delete button;
    delete textbox;
    delete factory;

    return 0;
}

在上述示例中,我们定义了抽象的按钮接口 Button 和文本框接口 Textbox,以及抽象工厂接口 GUIFactory。通过具体的按钮类和文本框类,以及具体的工厂类 WindowsFactory 和 LinuxFactory,我们可以实现针对不同操作系统的按钮和文本框对象的创建。

3 总结

通过使用抽象工厂模式,我们可以在客户端代码中根据当前操作系统选择对应的工厂类,并通过该工厂类创建相应的按钮和文本框对象,而无需关心具体的类和操作系统细节,从而实现了对象的解耦和横向扩展的灵活性。