C++设计模式之工厂模式

接下来我将详细讲解C++设计模式之工厂模式的完整攻略。

工厂模式概述

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们使用一个工厂方法来创建对象,而不是直接通过new来创建。这样有助于我们实现松耦合和高内聚。

工厂模式的核心思想是定义一个用来创建对象的接口,让子类决定具体要实例化对象的类。这样能够将具体的实现类和客户端分离,使得客户端无需直接关心实例化的过程,只需调用工厂方法即可获取需要的对象。

具体而言,工厂模式可分为简单工厂模式、工厂方法模式和抽象工厂模式。

简单工厂模式

简单工厂模式(Simple Factory Pattern)又称静态工厂方法模式,它定义一个工厂类,该类负责创建不同类型的对象并返回给调用者。

下面是一个简单工厂模式的示例代码:

#include <iostream>
using namespace std;

// 抽象产品
class Product
{
public:
    virtual void show() const = 0;
};

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

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

// 工厂类
class Factory
{
public:
    Product* createProduct(const char type) const
    {
        switch (type)
        {
            case 'A': return new ProductA();
            case 'B': return new ProductB();
            default: return nullptr;
        }
    }
};

// 客户端代码
int main()
{
    Factory factory;
    Product* productA = factory.createProduct('A');
    productA->show();

    Product* productB = factory.createProduct('B');
    productB->show();

    delete productA;
    delete productB;

    return 0;
}

在上面的示例代码中,我们首先定义了一个抽象产品Product和两个具体产品ProductAProductB,它们都继承自Product。然后定义了一个工厂类Factory,其中的createProduct方法接收一个产品类型type,根据类型返回不同的具体产品对象。最后,在客户端代码中,我们使用工厂对象创建不同类型的产品对象,并调用它们的show方法。

工厂方法模式

工厂方法模式(Factory Method Pattern)是在简单工厂模式的基础上发展而来的。它定义了一个抽象工厂,具体的工厂由具体的产品类继承实现。这样每个具体的产品都有对应的具体工厂,客户端只需调用工厂方法即可创建产品对象,不再需要关注具体的实现。

下面是一个工厂方法模式的示例代码:

#include <iostream>
using namespace std;

// 抽象产品
class Product
{
public:
    virtual void show() const = 0;
};

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

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

// 抽象工厂
class Factory
{
public:
    virtual Product* createProduct() const = 0;
};

// 具体工厂A
class FactoryA : public Factory
{
public:
    Product* createProduct() const override { return new ProductA(); }
};

// 具体工厂B
class FactoryB : public Factory
{
public:
    Product* createProduct() const override { return new ProductB(); }
};

// 客户端代码
int main()
{
    Factory* factoryA = new FactoryA();
    Product* productA = factoryA->createProduct();
    productA->show();
    delete productA;
    delete factoryA;

    Factory* factoryB = new FactoryB();
    Product* productB = factoryB->createProduct();
    productB->show();
    delete productB;
    delete factoryB;

    return 0;
}

在上面的示例代码中,我们首先定义了一个抽象产品Product和两个具体产品ProductAProductB,它们都继承自Product。然后定义了一个抽象工厂Factory,其中的createProduct方法返回一个产品对象。接着,定义了两个具体工厂类FactoryAFactoryB,它们分别负责创建具体产品A和B。最后,在客户端代码中,我们使用具体工厂创建不同类型的产品对象,并调用它们的show方法。

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是在工厂方法模式的基础上发展而来的。它定义了一个抽象工厂,每个抽象工厂可以创建多个不同的产品,且每个产品都有多个不同的实现。具体工厂继承自抽象工厂,负责创建具体的产品实例。

下面是一个抽象工厂模式的示例代码:

#include <iostream>
using namespace std;

// 抽象产品A
class AbstractProductA
{
public:
    virtual void display() const = 0;
};

// 具体产品A1
class ProductA1 : public AbstractProductA
{
public:
    void display() const override { cout << "ProductA1" << endl; }
};

// 具体产品A2
class ProductA2 : public AbstractProductA
{
public:
    void display() const override { cout << "ProductA2" << endl; }
};

// 抽象产品B
class AbstractProductB
{
public:
    virtual void display() const = 0;
};

// 具体产品B1
class ProductB1 : public AbstractProductB
{
public:
    void display() const override { cout << "ProductB1" << endl; }
};

// 具体产品B2
class ProductB2 : public AbstractProductB
{
public:
    void display() const override { cout << "ProductB2" << endl; }
};

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

// 具体工厂1
class ConcreteFactory1 : public AbstractFactory
{
public:
    AbstractProductA* createProductA() const override { return new ProductA1(); }
    AbstractProductB* createProductB() const override { return new ProductB1(); }
};

// 具体工厂2
class ConcreteFactory2 : public AbstractFactory
{
public:
    AbstractProductA* createProductA() const override { return new ProductA2(); }
    AbstractProductB* createProductB() const override { return new ProductB2(); }
};

// 客户端代码
int main()
{
    AbstractFactory* factory1 = new ConcreteFactory1();
    AbstractProductA* productA1 = factory1->createProductA();
    AbstractProductB* productB1 = factory1->createProductB();
    productA1->display();
    productB1->display();
    delete productA1;
    delete productB1;
    delete factory1;

    AbstractFactory* factory2 = new ConcreteFactory2();
    AbstractProductA* productA2 = factory2->createProductA();
    AbstractProductB* productB2 = factory2->createProductB();
    productA2->display();
    productB2->display();
    delete productA2;
    delete productB2;
    delete factory2;

    return 0;
}

在上面的示例代码中,我们首先定义了两个抽象产品AbstractProductAAbstractProductB,它们都定义了各自的接口方法。然后定义了四个具体产品类ProductA1ProductA2ProductB1ProductB2,它们都继承自对应的抽象产品。接着,定义了一个抽象工厂AbstractFactory,其中的createProductA方法和createProductB方法分别负责创建抽象产品A和B的实例。最后,定义了两个具体工厂类ConcreteFactory1ConcreteFactory2,它们分别生成具体产品A1和B1、A2和B2。

在客户端代码中,我们使用具体工厂来创建产品,并分别调用它们的display方法,我们可以看到,通过不同的具体工厂,我们可以创建不同种类的具体产品并执行其对应的操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++设计模式之工厂模式 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Docker容器编排实现过程解析

    Docker容器编排实现过程解析 容器编排是将多个容器组合在一起以便协同工作的过程。Docker容器编排可以指定容器的启动和停止顺序和必要的依赖关系。在本文中,我们将详细讲解Docker容器编排的实现过程。 Docker容器编排的实现过程 Docker容器编排的实现过程可以分为以下步骤: 步骤1:编写Docker Compose文件 Docker Compo…

    other 2023年6月20日
    00
  • 漫游配置文件和本地配置文件有啥区别? Win11快速禁用漫游配置文件的技巧

    当我们在使用 Microsoft 帐户登录到 Windows 11 时,默认情况下会开启“漫游用户个人设置(Roaming user profiles)”功能。这个功能会将用户的个人设置和文件自动上传到 Microsoft 云端,同时也可以在不同的设备上同步用户的设置和文件。这就是漫游配置文件。 与之相对应的是本地配置文件,也就是不与任何云服务同步的用户配置…

    other 2023年6月25日
    00
  • springboot整合@scheduled定时任务的使用-从精通到陌生…

    SpringBoot整合@Scheduled定时任务的使用-从精通到陌生… SpringBoot的定时任务是非常常用的功能,而@Scheduled注解则是SpringBoot实现定时任务最常用的一种方式。本文将从以下几个方面详细讲解SpringBoot整合@Scheduled定时任务的使用,帮助读者逐渐掌握使用到陌生的整个过程。 一、@Scheduled…

    其他 2023年3月28日
    00
  • 将数据导入hive,将数据从hive导出

    将数据导入Hive,将数据从Hive导出的完整攻略 Hive是一个基于Hadoop的数据仓库工具,它可以将结构化数据映射到Hadoop的分布式文件系统上,并提供类SQL查询功能。本文将为您提供一份详细的将数据导入Hive,将数据从Hive导出的完整攻略,包括数据导入和导出的基本概念、使用方法和两个示例说明。 数据导入的基本概念 在Hive中,数据导入是指将数…

    other 2023年5月5日
    00
  • 多种方法实现360浏览器下禁止自动填写用户名密码

    要禁止360浏览器下的自动填写用户名密码功能,可以采用以下多种方法实现: 方法一:使用HTML标签的autocomplete属性 在登录页面的用户名和密码的input标签中添加autocomplete=”off”属性,可以禁止360浏览器自动填写用户名和密码信息。 示例代码如下: <form> <label for="userna…

    other 2023年6月27日
    00
  • N叉树的三种遍历(层次遍历、前序遍历、后序遍历)

    N叉树是一种特殊的树形结构,它的每个节点可以拥有多个子节点。在对N叉树进行遍历时,有三种常用的遍历方式:层次遍历、前序遍历和后序遍历。 层次遍历 层次遍历是一种逐层遍历整棵N叉树的方法,它是通过队列实现的。可以采用BFS算法(广度优先遍历)将每一层的节点先全部入队列,然后依次出队列并输出。 示例1: 对于如下的一棵简单的N叉树,进行层次遍历: 1 /|\ \…

    other 2023年6月27日
    00
  • java property配置文件管理工具框架过程详解

    Java Property 配置文件管理工具框架是 Java 语言中用于管理配置文件的一种工具框架。本攻略将详细讲解使用该框架的过程,包含如下内容: 安装 Java Property 配置文件管理工具框架 配置文件的定义和使用 代码示例:读取配置文件 代码示例:写入配置文件 接下来将详细介绍这些内容。 安装 Java Property 配置文件管理工具框架 …

    other 2023年6月25日
    00
  • gta5最全mod整合包2022

    感谢您对我的提问,下面是对 gta5 最全 Mod 整合包 2022 的完整攻略: 1. 确定你的游戏版本 在开始之前,请确保你的游戏版本和 Mod 版本兼容,如果不兼容,Mod 无法正常运行。首先,你需要在游戏设置里找到 GTA5 版本号码。 2. 下载 Mod 整合包 接下来,你需要下载最全 Mod 整合包 2022,这里选择 gta5mods.com …

    其他 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部