当前位置: 首页 > article >正文

C/C++实现工厂模板设计模式(Factory Pattern)

工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定具体的类。工厂模式通过定义一个创建对象的接口,让子类决定实例化哪一个类。工厂模式可以分为简单工厂模式、工厂方法模式和抽象工厂模式。

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

#include <iostream>
#include <memory>

// 产品基类
class Product {
public:
    virtual void use() = 0;
    virtual ~Product() = default;
};

// 具体产品A
class ProductA : public Product {
public:
    void use() override {
        std::cout << "Using Product A" << std::endl;
    }
};

// 具体产品B
class ProductB : public Product {
public:
    void use() override {
        std::cout << "Using Product B" << std::endl;
    }
};

// 工厂类
class Factory {
public:
    // 创建产品的方法
    static std::unique_ptr<Product> createProduct(const std::string& type) {
        if (type == "A") {
            return std::make_unique<ProductA>();
        } else if (type == "B") {
            return std::make_unique<ProductB>();
        } else {
            return nullptr;
        }
    }
};

int main() {
    // 使用工厂创建产品A
    std::unique_ptr<Product> productA = Factory::createProduct("A");
    if (productA) {
        productA->use();
    }

    // 使用工厂创建产品B
    std::unique_ptr<Product> productB = Factory::createProduct("B");
    if (productB) {
        productB->use();
    }

    return 0;
}

代码说明:

  1. Product 是产品的基类,定义了产品的接口 use()
  2. ProductAProductB 是具体的产品类,分别实现了 use() 方法。
  3. Factory 是工厂类,提供了一个静态方法 createProduct(),根据传入的参数决定创建哪种产品。
  4. main() 函数中,通过工厂类创建了不同的产品,并调用了它们的 use() 方法。

工厂方法模式:

工厂方法模式是对简单工厂模式的进一步抽象,它将工厂类抽象为一个接口,具体的工厂子类负责创建具体的产品。

#include <iostream>
#include <memory>

// 产品基类
class Product {
public:
    virtual void use() = 0;
    virtual ~Product() = default;
};

// 具体产品A
class ProductA : public Product {
public:
    void use() override {
        std::cout << "Using Product A" << std::endl;
    }
};

// 具体产品B
class ProductB : public Product {
public:
    void use() override {
        std::cout << "Using Product B" << std::endl;
    }
};

// 工厂基类
class Factory {
public:
    virtual std::unique_ptr<Product> createProduct() = 0;
    virtual ~Factory() = default;
};

// 具体工厂A
class FactoryA : public Factory {
public:
    std::unique_ptr<Product> createProduct() override {
        return std::make_unique<ProductA>();
    }
};

// 具体工厂B
class FactoryB : public Factory {
public:
    std::unique_ptr<Product> createProduct() override {
        return std::make_unique<ProductB>();
    }
};

int main() {
    // 使用工厂A创建产品A
    std::unique_ptr<Factory> factoryA = std::make_unique<FactoryA>();
    std::unique_ptr<Product> productA = factoryA->createProduct();
    productA->use();

    // 使用工厂B创建产品B
    std::unique_ptr<Factory> factoryB = std::make_unique<FactoryB>();
    std::unique_ptr<Product> productB = factoryB->createProduct();
    productB->use();

    return 0;
}

代码说明:

  1. Factory 是工厂基类,定义了一个纯虚函数 createProduct(),具体的工厂子类需要实现这个方法来创建具体的产品。
  2. FactoryAFactoryB 是具体的工厂类,分别负责创建 ProductAProductB
  3. main() 函数中,通过具体的工厂类创建了不同的产品,并调用了它们的 use() 方法。

抽象工厂模式:

抽象工厂模式是工厂方法模式的扩展,它提供了一个接口用于创建一系列相关或依赖的对象,而无需指定它们的具体类。

#include <iostream>
#include <memory>

// 产品A基类
class ProductA {
public:
    virtual void use() = 0;
    virtual ~ProductA() = default;
};

// 具体产品A1
class ProductA1 : public ProductA {
public:
    void use() override {
        std::cout << "Using Product A1" << std::endl;
    }
};

// 具体产品A2
class ProductA2 : public ProductA {
public:
    void use() override {
        std::cout << "Using Product A2" << std::endl;
    }
};

// 产品B基类
class ProductB {
public:
    virtual void use() = 0;
    virtual ~ProductB() = default;
};

// 具体产品B1
class ProductB1 : public ProductB {
public:
    void use() override {
        std::cout << "Using Product B1" << std::endl;
    }
};

// 具体产品B2
class ProductB2 : public ProductB {
public:
    void use() override {
        std::cout << "Using Product B2" << std::endl;
    }
};

// 抽象工厂基类
class AbstractFactory {
public:
    virtual std::unique_ptr<ProductA> createProductA() = 0;
    virtual std::unique_ptr<ProductB> createProductB() = 0;
    virtual ~AbstractFactory() = default;
};

// 具体工厂1
class ConcreteFactory1 : public AbstractFactory {
public:
    std::unique_ptr<ProductA> createProductA() override {
        return std::make_unique<ProductA1>();
    }
    std::unique_ptr<ProductB> createProductB() override {
        return std::make_unique<ProductB1>();
    }
};

// 具体工厂2
class ConcreteFactory2 : public AbstractFactory {
public:
    std::unique_ptr<ProductA> createProductA() override {
        return std::make_unique<ProductA2>();
    }
    std::unique_ptr<ProductB> createProductB() override {
        return std::make_unique<ProductB2>();
    }
};

int main() {
    // 使用具体工厂1创建产品A1和B1
    std::unique_ptr<AbstractFactory> factory1 = std::make_unique<ConcreteFactory1>();
    std::unique_ptr<ProductA> productA1 = factory1->createProductA();
    std::unique_ptr<ProductB> productB1 = factory1->createProductB();
    productA1->use();
    productB1->use();

    // 使用具体工厂2创建产品A2和B2
    std::unique_ptr<AbstractFactory> factory2 = std::make_unique<ConcreteFactory2>();
    std::unique_ptr<ProductA> productA2 = factory2->createProductA();
    std::unique_ptr<ProductB> productB2 = factory2->createProductB();
    productA2->use();
    productB2->use();

    return 0;
}

代码说明:

  1. ProductAProductB 是产品基类,定义了产品的接口 use()
  2. ProductA1, ProductA2, ProductB1, ProductB2 是具体的产品类,分别实现了 use() 方法。
  3. AbstractFactory 是抽象工厂基类,定义了两个纯虚函数 createProductA()createProductB(),具体的工厂子类需要实现这些方法来创建具体的产品。
  4. ConcreteFactory1ConcreteFactory2 是具体的工厂类,分别负责创建 ProductA1, ProductB1ProductA2, ProductB2
  5. main() 函数中,通过具体的工厂类创建了不同的产品,并调用了它们的 use() 方法。

这些示例展示了如何使用C++实现工厂模式的三种变体:简单工厂模式、工厂方法模式和抽象工厂模式。每种模式都有其适用的场景,选择哪种模式取决于具体的需求和设计目标。


http://www.kler.cn/a/588901.html

相关文章:

  • 如何配置 Docker 以实现无需 sudo 使用
  • 《解锁 Lodash:简化复杂逻辑的实战技巧》​
  • 浏览器对一个资源设置了缓存,如何清除缓存,且后续请求不命中缓存
  • 深入浅出TCP与UDP:三次握手、四次挥手及面试通关指南
  • 哈尔滨算力服务器托管推荐-青蛙云
  • 运行Clip多模态模型报错:OSError: Can‘t load tokenizer for ‘bert-base-chinese‘
  • Spring Cloud Eureka - 高可用服务注册与发现解决方案
  • 在使用element-ui时表单的表头在切换页面时第一次进入页面容易是白色字体解决方法
  • springboot+vue如何前后端联调,手搓前后端分离项目
  • 三角函数:从宇宙法则到AI革命的数学密钥
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(51)混沌钟定排列 - 全排列(回溯与剪枝)
  • 安全测试数据的分析、报告及业务应用
  • Java EE 进阶:Spring Boot 日志
  • 获取pytdx行情服务器ip和port
  • Golang倒腾一款简配的具有请求排队功能的并发受限服务器
  • 如何在Linux中切换用户?
  • 从零到精通文本指令:打造个人AI助理的完整指令库(Prompt 指令实操)
  • HTML 列表:构建清晰结构的网页内容
  • 如何通过数据分析提升美容院顾客复购率
  • 设计模式之组合模式:原理、实现与应用