C++抽象工厂模式

本文详细介绍了抽象工厂模式,这是一种创建型设计模式,用于创建一系列相关的产品对象。文章通过C++代码展示了如何定义抽象产品类、具体产品类、抽象工厂以及具体工厂,并在主函数中演示了如何使用不同工厂创建和使用产品。
摘要由CSDN通过智能技术生成
/**
    《抽象工厂》 
    抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

    抽象工厂模式建议为系列中的每件产品明确声明接口 (例如椅子、 沙发或咖啡桌)。 
    然后,确保所有产品变体都继承这些接口.
    例如, 所有风格的椅子都实现 椅子接口; 所有风格的咖啡桌都实现 咖啡桌接口, 以此类推。
 */

#include <iostream>
#include <string>

// 抽象产品类
class AbstractProductA
{
public:
    virtual ~AbstractProductA() {}
    virtual std::string UsefulFunctionA() const = 0;
};

// 抽象产品的多种不同实现
class ConcreteProductA1 : public AbstractProductA
{
public:
    std::string UsefulFunctionA() const override
    {
        return "the result of the product A1";
    }
};

class ConcreteProductA2 : public AbstractProductA
{
public:
    std::string UsefulFunctionA() const override
    {
        return "the result of the product A2";
    }
};

// 另一个抽象类产品
class AbstractProductB
{
public:
    virtual ~AbstractProductB() {}
    virtual std::string UsefulFunctionB() const = 0;
    virtual std::string AnotherUsefulFuncitonB(const AbstractProductA &collaborator) const = 0;
};

// 抽象产品的多种不同实现
class ConcreteProductB1 : public AbstractProductB
{
public:
    std::string UsefulFunctionB() const override
    {
        return "the result of the product B1";
    }

    std::string AnotherUsefulFuncitonB(const AbstractProductA &collaborator) const override
    {
        const std::string result = collaborator.UsefulFunctionA();
        return "the reuslt of the B1 collaborator with ( " + result + " )";
    }
};

class ConcreteProductB2 : public AbstractProductB
{
public:
    std::string UsefulFunctionB() const override
    {
        return "the result of the product B2";
    }

    std::string AnotherUsefulFuncitonB(const AbstractProductA &collaborator) const override
    {
        const std::string result = collaborator.UsefulFunctionA();
        return "the result of the B2 collaborator with ( " + result + " )";
    }
};


// 抽象工厂
class AbstractFactory
{
public:
    virtual AbstractProductA *CreateProductA() const = 0;
    virtual AbstractProductB *CreateProductB() const = 0;
};

// 具体的工厂
class ConcreteFactory1 : public AbstractFactory
{
public:
    AbstractProductA* CreateProductA() const override
    {
        return new ConcreteProductA1();
    }

    AbstractProductB* CreateProductB() const override
    {
        return new ConcreteProductB1();
    }
};

class ConcreteFactory2 : public AbstractFactory
{
public:
    AbstractProductA* CreateProductA() const override
    {
        return new ConcreteProductA2();
    }

    AbstractProductB* CreateProductB() const override
    {
        return new ConcreteProductB2();
    }
};


int main()
{
    // 新建一个工厂
    ConcreteFactory1 *factory1 = new ConcreteFactory1();
    // 从这个工厂生产两个产品
    AbstractProductA *product1_a = factory1->CreateProductA();
    AbstractProductB *product1_b = factory1->CreateProductB();
    // 使用产品
    std::cout << product1_a->UsefulFunctionA() << std::endl;
    std::cout << product1_b->UsefulFunctionB() << std::endl;
    std::cout << product1_b->AnotherUsefulFuncitonB(*product1_a) << std::endl;

    std::cout << "----------------" << std::endl;

    // 使用另一个工厂去生产产品
    ConcreteFactory2 *factory2 = new ConcreteFactory2();
    AbstractProductA *product2_a = factory2->CreateProductA();
    AbstractProductB *product2_b = factory2->CreateProductB();
    std::cout << product2_a->UsefulFunctionA() << std::endl;
    std::cout << product2_b->UsefulFunctionB() << std::endl;
    std::cout << product2_b->AnotherUsefulFuncitonB(*product2_a) << std::endl;
}
以下是C++抽象工厂模式的伪代码示例: ```cpp // 抽象产品类 class AbstractProductA { public: virtual void operationA() = 0; }; // 具体产品类A1 class ProductA1 : public AbstractProductA { public: void operationA() override { // 具体操作 } }; // 具体产品类A2 class ProductA2 : public AbstractProductA { public: void operationA() override { // 具体操作 } }; // 抽象产品类 class AbstractProductB { public: virtual void operationB() = 0; }; // 具体产品类B1 class ProductB1 : public AbstractProductB { public: void operationB() override { // 具体操作 } }; // 具体产品类B2 class ProductB2 : public AbstractProductB { public: void operationB() override { // 具体操作 } }; // 抽象工厂类 class AbstractFactory { public: virtual AbstractProductA* createProductA() = 0; virtual AbstractProductB* createProductB() = 0; }; // 具体工厂类1 class ConcreteFactory1 : public AbstractFactory { public: AbstractProductA* createProductA() override { return new ProductA1(); } AbstractProductB* createProductB() override { return new ProductB1(); } }; // 具体工厂类2 class ConcreteFactory2 : public AbstractFactory { public: AbstractProductA* createProductA() override { return new ProductA2(); } AbstractProductB* createProductB() override { return new ProductB2(); } }; // 客户端代码 int main() { AbstractFactory* factory = new ConcreteFactory1(); AbstractProductA* productA = factory->createProductA(); AbstractProductB* productB = factory->createProductB(); productA->operationA(); productB->operationB(); delete productA; delete productB; delete factory; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙子砰砰枪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值