// main.cpp
#include <QtCore/QCoreApplication>
#include <qmetaobject.h>
#include "car.h"
/*
Factory method
A framework needs to standardize the architectural model for a range of applications.
but allow for indiviaul applications to define their own domain objects and provide for their instantiation.
*/
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QMetaEnum metaEnum = QMetaEnum::fromType<car::Model>();
for (int i = 0; i < metaEnum.keyCount(); i++) {
QString key = metaEnum.key(i);
qInfo() << "Attempting to create: " << key;
car::Model model = static_cast<car::Model>(metaEnum.keyToValue(key.toLatin1()));
car* c = car::make(model);
c->drive();
qInfo("");
}
return a.exec();
}
// car.h
#pragma once
#include <QObject>
#include <qmetaobject.h>
#include <qmetatype.h>
#include <qdebug.h>
class car : public QObject
{
Q_OBJECT
public:
enum Model{
SLOWCAR,
SPORTSCAR,
RACECAR
};
Q_ENUM(Model)
static car* make(Model model);
virtual void drive() = 0;
explicit car(QObject *parent = nullptr);
~car();
};
// car.cpp
#include "car.h"
#include "race.h"
#include "slow.h"
#include "sports.h"
car::car(QObject *parent)
: QObject(parent)
{
}
car::~car()
{
}
car* car::make(car::Model model)
{
QMetaEnum metaEnum = QMetaEnum::fromType<car::Model>();
qInfo() << "Creating: " << metaEnum.valueToKey(model);
switch (model) {
case car::Model::SLOWCAR:
return new slow(nullptr);
case car::Model::SPORTSCAR:
return new sports(nullptr);
case car::Model::RACECAR:
return new race(nullptr);
}
return new slow(nullptr);
}
