以下是一个使用 C++ 实现的简单抽象工厂模式的示例:

#include <iostream>

// Abstract Product A
class AbstractProductA {
public:
    virtual void operationA() = 0;
};

// Concrete Product A1
class ConcreteProductA1 : public AbstractProductA {
public:
    void operationA() override {
        std::cout << "ConcreteProductA1 operationA" << std::endl;
    }
};

// Concrete Product A2
class ConcreteProductA2 : public AbstractProductA {
public:
    void operationA() override {
        std::cout << "ConcreteProductA2 operationA" << std::endl;
    }
};

// Abstract Product B
class AbstractProductB {
public:
    virtual void operationB() = 0;
};

// Concrete Product B1
class ConcreteProductB1 : public AbstractProductB {
public:
    void operationB() override {
        std::cout << "ConcreteProductB1 operationB" << std::endl;
    }
};

// Concrete Product B2
class ConcreteProductB2 : public AbstractProductB {
public:
    void operationB() override {
        std::cout << "ConcreteProductB2 operationB" << std::endl;
    }
};

// Abstract Factory
class AbstractFactory {
public:
    virtual AbstractProductA* createProductA() = 0;
    virtual AbstractProductB* createProductB() = 0;
};

// Concrete Factory 1
class ConcreteFactory1 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override {
        return new ConcreteProductA1();
    }

    AbstractProductB* createProductB() override {
        return new ConcreteProductB1();
    }
};

// Concrete Factory 2
class ConcreteFactory2 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override {
        return new ConcreteProductA2();
    }

    AbstractProductB* createProductB() override {
        return new ConcreteProductB2();
    }
};

int main() {
    // Create factory 1
    AbstractFactory* factory1 = new ConcreteFactory1();

    // Create products using factory 1
    AbstractProductA* productA1 = factory1->createProductA();
    AbstractProductB* productB1 = factory1->createProductB();

    productA1->operationA(); // Output: ConcreteProductA1 operationA
    productB1->operationB(); // Output: ConcreteProductB1 operationB

    // Create factory 2
    AbstractFactory* factory2 = new ConcreteFactory2();

    // Create products using factory 2
    AbstractProductA* productA2 = factory2->createProductA();
    AbstractProductB* productB2 = factory2->createProductB();

    productA2->operationA(); // Output: ConcreteProductA2 operationA
    productB2->operationB(); // Output: ConcreteProductB2 operationB

    // Clean up
    delete productA1;
    delete productB1;
    delete productA2;
    delete productB2;
    delete factory1;
    delete factory2;

    return 0;
}

在这个示例中,我们首先定义了抽象产品类 AbstractProductAAbstractProductB,并且分别派生出了具体的产品类 ConcreteProductA1ConcreteProductA2ConcreteProductB1ConcreteProductB2。然后,我们定义了抽象工厂类 AbstractFactory,其中包含创建产品的纯虚函数。接着,我们派生出了具体的工厂类 ConcreteFactory1ConcreteFactory2,分别实现了创建不同产品的方法。最后,在 main 函数中使用具体的工厂来创建产品,并调用其操作方法。

运行这个示例将输出以下结果:

ConcreteProductA1 operationA
ConcreteProductB1 operationB
ConcreteProductA2 operationA
ConcreteProductB2 operationB

这个示例展示了抽象工厂模式的基本结构和使用方法。通过使用抽象工厂模式,客户端代码可以通过抽象的工厂接口来创建产品,而无需直接指定具体的产品类,从而实现了解耦。这样可以更容易地切换和扩展产品系列,同时保持客户端代码的一致性。