工厂方法模式

factory.h

复制代码
#ifndef FACTORY_H
#define FACTORY_H
#include <QString>
//工厂
class Factory
{
public:
    Factory(){};
    // FruitFactory* p = new AppleFactory();
    // // ...
    // delete p;  // 注意:是通过基类指针删子类对象
    // 如果 FruitFactory 的析构函数不是 virtual:
    // delete p; 只会调用 FruitFactory 的析构函数
    // 不会调用 AppleFactory 的析构函数
    // 结果是:AppleFactory 里自己管理的资源(比如 new 出来的内存、打开的文件、锁等)不会被释放,行为是未定义的(UB),最常见就是泄漏。
    virtual ~Factory()=default;
    // 类型方法:返回自己的工厂类型
    virtual QString getType() const = 0;
};
//苹果
class AppleFactory:public Factory
{
public:
    AppleFactory(){};
    QString getType()const override{
        return "apple";
    }
};
//香蕉
class BananaFactory:public Factory
{
public:
    BananaFactory(){};
    QString getType()const override{
        return "banana";
    }
};
//葡萄
class GrapeFactory:public Factory
{
public:
    GrapeFactory(){};
    QString getType()const override{
        return "grape";
    }
};

#endif // FACTORY_H

mainwindow.h

复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include "factory.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVector>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    AppleFactory *apple=new AppleFactory();
    BananaFactory *banana=new BananaFactory();
    GrapeFactory *grape=new GrapeFactory();
    Factory *f1=apple;
    Factory *f2=banana;
    Factory *f3=grape;
    QVector<Factory*> vec;
    vec.push_back(f1);
    vec.push_back(f2);
    vec.push_back(f3);
    for (auto item:vec) {
        qDebug()<<item->getType();
    }
    delete apple;
    delete banana;
    delete grape;
}

MainWindow::~MainWindow()
{
    delete ui;
}

运行截图:

相关推荐
失忆爆表症17 小时前
01_项目搭建指南:从零开始的 Windows 开发环境配置
windows·postgresql·fastapi·milvus
毕设源码-赖学姐17 小时前
【开题答辩全过程】以 基于python的电影推荐系统为例,包含答辩的问题和答案
开发语言·python
星辰_mya17 小时前
Elasticsearch线上问题之慢查询
java·开发语言·jvm
Yu_Lijing17 小时前
网络复习篇——网络基础(一)
网络·c++·笔记
前端小菜袅17 小时前
PC端原样显示移动端页面方案
开发语言·前端·javascript·postcss·px-to-viewport·移动端适配pc端
Bella的成长园地17 小时前
为什么c++中的条件变量的 wait() 函数需要配合while 循环或谓词?
c++·面试
Highcharts.js17 小时前
如何使用Highcharts SVG渲染器?
开发语言·javascript·python·svg·highcharts·渲染器
charlee4417 小时前
为什么现代 C++ 库都用 PIMPL?一场关于封装、依赖与安全的演进
c++·智能指针·raii·pimpl·编译防火墙·封装设计
郝学胜-神的一滴17 小时前
超越Spring的Summer(一): PackageScanner 类实现原理详解
java·服务器·开发语言·后端·spring·软件构建
摇滚侠17 小时前
Java,举例说明,函数式接口,函数式接口实现类,通过匿名内部类实现函数式接口,通过 Lambda 表达式实现函数式接口,演变的过程
java·开发语言·python