简介
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类实例化延迟到其子类。
UML
未实现
代码实现
//实例化香蕉和苹果工厂,来生产对应的水果
#ifndef MYFACTORY_H
#define MYFACTORY_H
#include <QObject>
class MyFactory : public QObject
{
Q_OBJECT
public:
explicit MyFactory(QObject *parent = nullptr);
signals:
};
//产品抽象类
class AbsProduct : public QObject
{
Q_OBJECT
public:
explicit AbsProduct(QObject *parent = nullptr);
virtual pintf() = 0;
signals:
};
//工厂抽象类
class AbsFactory : public QObject
{
Q_OBJECT
public:
explicit AbsFactory(QObject *parent = nullptr);
virtual AbsProduct *creatProduct() = 0;
signals:
};
class BananaProduct : public AbsProduct
{
Q_OBJECT
public:
explicit BananaProduct(QObject *parent = nullptr);
pintf();
};
class AppleProduct : public AbsProduct
{
Q_OBJECT
public:
explicit AppleProduct(QObject *parent = nullptr);
pintf();
};
class BananaFactory : public AbsFactory
{
Q_OBJECT
public:
explicit BananaFactory(QObject *parent = nullptr);
AbsProduct *creatProduct();
signals:
};
class AppleFactory : public AbsFactory
{
Q_OBJECT
public:
explicit AppleFactory(QObject *parent = nullptr);
AbsProduct *creatProduct();
signals:
};
#endif // MYFACTORY_H
// .c文件
AbsProduct::AbsProduct(QObject *parent): QObject{parent}
{
}
AbsFactory::AbsFactory(QObject *parent): QObject{parent}
{
}
BananaProduct::BananaProduct(QObject *parent): AbsProduct{parent}
{
}
BananaProduct::pintf()
{
qDebug()<<"I am a banana";
}
AppleProduct::AppleProduct(QObject *parent): AbsProduct{parent}
{
}
AppleProduct::pintf()
{
qDebug()<<"I am a apple";
}
BananaFactory::BananaFactory(QObject *parent): AbsFactory{parent}
{
}
AbsProduct *BananaFactory::creatProduct()
{
return new BananaProduct();
}
AppleFactory::AppleFactory(QObject *parent): AbsFactory{parent}
{
}
AbsProduct *AppleFactory::creatProduct()
{
return new AppleProduct();
}
// 测试工厂模式
void MainWindow::factoryTest()
{
AbsProduct *product = nullptr;
AbsFactory *factory = nullptr;
factory = new BananaFactory();
product = factory->creatProduct();
product->pintf();
delete product;
delete factory;
product = nullptr;
factory = nullptr;
factory = new AppleFactory();
product = factory->creatProduct();
product->pintf();
}