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;
}
运行截图:
