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日

相关文章

  • c++实现跳跃表(Skip List)的方法示例

    下面是详细讲解“c++实现跳跃表(Skip List)的方法示例”的完整攻略,包含以下几个部分: 1. 理解跳跃表 跳跃表是一种基于链表的数据结构,它允许快速插入、删除和查找操作。与普通的链表不同,跳跃表通过建立多级索引来加快查找速度,因此它的查找效率是 O(log n) 的。 跳跃表的核心思想是使用“跳跃”来预测应该在哪里查找目标节点。具体来说,跳跃表中的…

    other 2023年6月27日
    00
  • eclipse常用配置

    以下是关于如何配置Eclipse的完整攻略,包括常用配置和两个示例说明。 常用配置 1. 设置编码 在Eclipse中,我们可以设置编码来确保我们的代码能正确地显示和运行。以下是设置编码的步骤: 打开Eclipse,选择“Window”菜单,然后选择“Preferences”。 在弹出的对话框中,选择“General” -> “Workspace”。 …

    other 2023年5月9日
    00
  • 游戏内存如何炼成的 厂商工程师手记曝光

    游戏内存如何炼成的 厂商工程师手记曝光 简介 在这篇攻略中,我们将详细讲解游戏内存的制造过程。这些信息来自一位厂商工程师的手记,揭示了游戏内存的制造过程和一些关键细节。我们将介绍游戏内存的基本原理、制造流程以及两个示例说明。 游戏内存基本原理 游戏内存是计算机系统中的一种关键组件,用于存储正在运行的游戏程序和相关数据。它是一种易失性存储器,意味着在断电或重启…

    other 2023年8月1日
    00
  • 图文详解java内存回收机制

    图文详解Java内存回收机制 1. 引言 Java内存回收机制是Java虚拟机(JVM)的重要组成部分,它负责管理和回收程序运行过程中产生的垃圾对象。垃圾对象是指那些不再被程序使用的对象,占用内存空间但无法被访问到的对象。Java内存回收机制通过自动回收这些垃圾对象来释放内存空间,提高程序的性能和效率。 2. Java内存模型 在深入了解Java内存回收机制…

    other 2023年8月2日
    00
  • Centos设置静态IP及修改Centos配置文件的方法

    下面我将详细讲解如何在CentOS操作系统上设置静态IP及修改CentOS配置文件的方法。步骤如下: 步骤1:打开网卡配置文件 在CentOS系统中,所有网卡相关的配置信息存储在 /etc/sysconfig/network-scripts/ 目录下。因此,首先你需要打开该目录下的对应网卡的配置文件进行编辑。 比如,如果你要修改eth0网卡的配置信息,可以执…

    other 2023年6月25日
    00
  • Redis过期键与内存淘汰策略深入分析讲解

    Redis过期键与内存淘汰策略深入分析讲解 1. Redis过期键 Redis是一个基于内存的键值存储系统,它提供了一种过期键的机制,可以让键在一定时间后自动过期并被删除。这个机制对于缓存和临时数据非常有用。 1.1 过期键的设置 在Redis中,可以使用EXPIRE命令来设置一个键的过期时间。例如,下面的命令将键mykey的过期时间设置为60秒: EXPI…

    other 2023年8月2日
    00
  • jvm之java类加载机制和类加载器(ClassLoader)的用法

    我来为你详细讲解JVM之Java类加载机制和类加载器(ClassLoader)的用法。 1. Java类加载机制 Java类加载机制分为三个步骤: 加载(Loading):将.class文件字节码载入JVM中。 链接(Linking):将常量池中的符号引用转换为直接引用,验证类的合法性,为静态变量分配空间。 初始化(Initialization):为类的静态…

    other 2023年6月25日
    00
  • 使用隧道技术进行C&C通信

    使用隧道技术进行C&C通信 在黑客攻击中,命令控制(Command & Control)通信是非常重要的一环。攻击者通过C&C服务器发送恶意指令,并接收来自被感染设备的信息。然而,这种通信可能会被安全防护设施检测并拦截,从而使攻击失败。为了解决这个问题,攻击者通常会使用隧道技术进行C&C通信。 隧道技术简介 隧道技术是一种将一…

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