C++设计模式之简单工厂模式实例

yizhihongxing

C++设计模式之简单工厂模式实例详解

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。简单工厂模式定义了一个工厂类,它可以根据所传递的参数或配置文件的不同,返回不同类的实例。简单工厂模式具有简单易懂,适用范围广等特点,在实际开发中也得到了广泛应用。

简单工厂模式的结构

简单工厂模式包含三个主要角色:

  • 工厂类:简单工厂模式的核心,负责创建所有产品的实例。
  • 抽象产品类:定义产品的接口,是具体产品的基类。
  • 具体产品类:实现抽象产品类的接口,是被创建的对象。

简单工厂模式的结构图:

+------------+
|  Factory   |
+------------+
| createProd |
+------------+
       |
       | 实例化产品对象
       |
+------------+             +---------------+
| Product    | <---------  | ConcreteProd1 |
+------------+             +---------------+
| method1()  |             | method1()     |
| method2()  |             | method2()     |
+------------+             +---------------+
              实现

+------------+             +---------------+
| Product    | <---------  | ConcreteProd2 |
+------------+             +---------------+
| method1()  |             | method1()     |
| method2()  |             | method2()     |
+------------+             +---------------+

简单工厂模式示例

下面通过两个实例来详细介绍简单工厂模式的应用。

示例一:计算器程序

在计算器程序中,我们传递了两个数和运算符,根据运算符的不同返回不同的计算结果。通过使用简单工厂模式,我们可以实现这个过程。

首先,定义抽象产品类 Operation,其中定义了两个虚函数 getResult()setNum(),分别用于计算结果和设置操作数。

class Operation {
public:
    virtual double getResult() = 0;
    virtual void setNum(double a, double b) {
        numA = a;
        numB = b;
    }
protected:
    double numA;
    double numB;
};

然后,定义两个具体产品类 AddOperationSubOperation,分别实现抽象产品类的接口。在具体产品类中,我们可以实现具体的计算逻辑。

class AddOperation: public Operation
{
public:
    double getResult() override {
        return numA + numB;
    }
};

class SubOperation: public Operation
{
public:
    double getResult() override {
        return numA - numB;
    }
};

最后,定义工厂类 Factory,根据运算符的不同返回不同的产品实例。在工厂类中,我们使用了 switch 语句来判断运算符类型。

class Factory
{
public:
    static Operation* createOperation(char operate)
    {
        Operation* oper = nullptr;
        switch (operate) {
            case '+':
                oper = new AddOperation();
                break;
            case '-':
                oper = new SubOperation();
                break;
            default:
                cout << "invalid operate!" << endl;
                break;
        }
        return oper;
    }
};

在客户端中,我们可以通过如下代码调用工厂类,创建对应产品的实例,并调用其接口函数。

int main() {
    Operation* op = Factory::createOperation('+');
    op->setNum(1, 2);
    cout << op->getResult() << endl;
    return 0;
}

示例二:图形画笔程序

在图形画笔程序中,我们传递了一个图形类型,根据类型的不同返回不同绘制图形的画笔。同样通过使用简单工厂模式,我们可以实现这个过程。

首先,我们定义了工具类 Point,用于表示一个点。然后,定义抽象产品类 Shape,其中定义了两个纯虚函数 draw()setPoint(),分别用于绘制图形和设置绘制点。

class Shape
{
public:
    virtual void draw() = 0;
    virtual void setPoint(Point p) = 0;

protected:
    Point m_point;
};

class Point
{
public:
    Point(int x = 0, int y = 0) : m_x(x), m_y(y) {}
    void setPoint(int x, int y) { m_x = x; m_y = y; }
    void setX(int x) { m_x = x; }
    void setY(int y) { m_y = y; }
    int x() const { return m_x; }
    int y() const { return m_y; }
private:
    int m_x;
    int m_y;
};

然后,定义不同的具体产品类:LineShapeCircleShapeSquareShape,分别实现抽象产品类的接口。在每个具体产品类中,我们按照不同的逻辑实现具体的图形绘制过程。

// 按照覆盖父类的虚函数来实现具体产品类
class LineShape: public Shape
{
public:
    void draw() override {
        cout << "draw line from (" << m_point.x() << ", " << m_point.y() << ")" << endl;
    }
    void setPoint(Point p) override {
        m_point = p;
    }
};

class CircleShape: public Shape
{
public:
    void draw() override {
        cout << "draw circle with center (" << m_point.x() << ", " << m_point.y() << ")" << endl;
    }
    void setPoint(Point p) override {
        m_point = p;
    }
};

class SquareShape: public Shape
{
public:
    void draw() override {
        cout << "draw square with center (" << m_point.x() << ", " << m_point.y() << ")" << endl;
    }
    void setPoint(Point p) override {
        m_point = p;
    }
};

最后,定义工厂类 ShapeFactory,根据传入的参数类型返回不同的产品实例。在工厂类中,我们使用了 switch 语句来判断图形类型。

class ShapeFactory
{
public:
    static Shape* createShape(int type)
    {
        Shape* shape;
        switch (type) {
            case 1:
                shape = new LineShape();
                break;
            case 2:
                shape = new CircleShape();
                break;
            case 3:
                shape = new SquareShape();
                break;
            default:
                cout << "invalid shape!" << endl;
                shape = nullptr;
                break;
        }
        return shape;
    }
};

在客户端中,我们可以通过如下代码调用工厂类,创建对应产品的实例,并调用其接口函数。

int main() {
    Shape* shape1 = ShapeFactory::createShape(1);
    shape1->setPoint(Point(1, 1));
    shape1->draw();
    Shape* shape2 = ShapeFactory::createShape(2);
    shape2->setPoint(Point(2, 2));
    shape2->draw();
    Shape* shape3 = ShapeFactory::createShape(3);
    shape3->setPoint(Point(3, 3));
    shape3->draw();
    return 0;
}

总结

简单工厂模式可以方便地创建一些对象,减少了代码重复和耦合度。但是简单工厂模式有些缺点,在实现时需要考虑到可扩展性和可维护性问题。因为增加新产品需要修改工厂类的代码,这样会违背开放封闭原则。所以在实际项目中需要根据实际情况选用不同的设计模式。

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

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 天语Touch3c怎么获取ROOT权限?天语Touch3c刷机教程详细图解

    标题:天语Touch3c获取ROOT权限及刷机教程 获取ROOT权限步骤 步骤一:解锁天语Touch3c的Bootloader 在天语Touch3c设备中启用开发者选项。打开设置 -> 关于手机 -> 连续点击版本号,即可开启开发者模式。 返回设置主界面,选择开发者选项,打开USB调试选项和OEM解锁选项。 连接您的设备到计算机上,打开命令行窗口…

    C 2023年5月22日
    00
  • Python中with上下文管理协议的作用及用法

    下面就来详细讲解“Python中with上下文管理协议的作用及用法”的完整攻略。 什么是上下文管理协议 在Python中,上下文管理指的是在资源使用中的安全获取和释放的机制。这个机制就是基于Python的上下文管理协议实现的。 上下文管理协议是指有赖于特定的方法支持协议的对象的协议。这些方法包括__enter__和__exit__,称为上下文管理器。使用这种…

    C 2023年5月23日
    00
  • C程序 查找矩形面积和周长

    C程序 查找矩形面积和周长使用攻略 程序介绍 该C程序是用于计算矩形的面积和周长的。用户可以输入矩形的长和宽,程序会自动计算并输出矩形的面积和周长。 程序使用说明 下载并编译程序 用户需要使用编译器(如gcc)来编译程序。在命令行中输入以下代码即可完成编译。 gcc find rectangle.c -o find_rectangle 其中,find rec…

    C 2023年5月9日
    00
  • C 文件读写

    下面是关于C文件读写的完整使用攻略。 一. 文件读写概述 文件读写是指对硬盘中的文件进行读取或写入的操作,主要使用文件指针、文件流、文件模式、文件大小、文件类型等概念和函数来实现。在C语言中,文件读写操作主要通过 头文件和相关的函数来实现。 二. 文件读写的基本操作 文件读写需要先打开文件,然后读写文件,最后关闭文件,这是基本的文件读写流程。 2.1 打开文…

    C 2023年5月10日
    00
  • oppor1c配置怎么样?价格多少?

    Oppo R1C的配置和价格详解 Oppo R1C的配置 Oppo R1C是一款在2015年初推出的定位中高端的手机,其主要配置包括: 处理器:骁龙615(64位八核); 存储:2G RAM + 16GB ROM,支持最高128GB外部存储卡; 屏幕:5英寸1080P全高清; 摄像头:后置1300万像素,前置500万像素; 电池:2420mAh(不可拆卸);…

    C 2023年5月23日
    00
  • C++程序代码优化的方法实例大全

    C++程序代码优化的方法实例大全 本文将为大家介绍C++程序代码优化的方法实例大全。通过本文的内容,可以帮助你更好地优化C++程序的代码,提高程序的性能。 一、代码优化的目标 代码优化的主要目标包括: 提高程序的运行速度和响应速度; 减少程序的内存占用和磁盘占用; 提高程序的可读性和可维护性。 二、优化方法 下面是几种常见的C++程序代码优化方法。 1. 使…

    C 2023年5月23日
    00
  • Qt QDateTime计算时间差的实现示例

    针对“Qt QDateTime计算时间差的实现示例”的完整攻略,我将从以下几个部分进行讲解: QDateTime类的概述 计算时间差的方法 示例说明 1. QDateTime类的概述 QDateTime是Qt中用来提供日期和时间值的类,它继承自QDate和QTime类。QDateTime类的主要成员函数有date(),time(),addSecs()等,可以…

    C 2023年5月23日
    00
  • C语言实现贪吃蛇超详细教程

    C语言实现贪吃蛇超详细教程 1. 简介 贪吃蛇是一款非常经典的游戏,同时其也是初学者学习编程的一个很好的练习项目,本教程将带领大家使用C语言来实现贪吃蛇。 2. 实现步骤 2.1 初始化 首先,我们需要初始化游戏窗口、贪吃蛇的位置、食物的位置以及其他一些必要的变量。 以Windows窗口为例,我们可以使用WinAPI来创建一个窗口,并使用CreateWind…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部