DEV Community

海前 王
海前 王

Posted on

factory qt

include

include

include

include

include

// 基类
class MyBase : public QObject {
Q_OBJECT
public:
explicit MyBase(QObject *parent = nullptr) : QObject(parent) {}
virtual void doSomething() = 0;
};

// 派生类1
class MyDerived1 : public MyBase {
Q_OBJECT
public:
explicit MyDerived1(QObject *parent = nullptr) : MyBase(parent) {}
void doSomething() override {
qDebug() << "MyDerived1 doing something!";
}
};

// 派生类2
class MyDerived2 : public MyBase {
Q_OBJECT
public:
explicit MyDerived2(QObject *parent = nullptr) : MyBase(parent) {}
void doSomething() override {
qDebug() << "MyDerived2 doing something!";
}
};

// 工厂类
class MyFactory {
public:
// 注册工厂函数
static void registerClass(const QString& className, QObject* (*creator)()) {
getRegistry()[className] = creator;
}

// 创建对象
static MyBase* createObject(const QString& className) {
    auto it = getRegistry().find(className);
    if (it != getRegistry().end()) {
        QObject* (*creator)() = it.value();
        qDebug() << "Creating object for class:" << className;
        return qobject_cast<MyBase*>(creator());
    }
    qDebug() << "Class not found:" << className;
    return nullptr;
}
Enter fullscreen mode Exit fullscreen mode

private:
// 获取注册表
static QMap& getRegistry() {
static QMap registry;
return registry;
}
};

// 定义工厂函数
QObject* createMyDerived1() { return new MyDerived1(); }
QObject* createMyDerived2() { return new MyDerived2(); }

// 注册类
static bool registered1 = {
MyFactory::registerClass("MyDerived1", createMyDerived1);
return true;
}();

static bool registered2 = {
MyFactory::registerClass("MyDerived2", createMyDerived2);
return true;
}();

// 主函数
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);

// 使用工厂创建对象
QString className1 = "MyDerived1";
QString className2 = "MyDerived2";

MyBase* obj1 = MyFactory::createObject(className1);
MyBase* obj2 = MyFactory::createObject(className2);

// 使用对象
if (obj1) {
    obj1->doSomething();
    delete obj1;
}

if (obj2) {
    obj2->doSomething();
    delete obj2;
}

return app.exec();
Enter fullscreen mode Exit fullscreen mode

}

include "main.moc"

Top comments (0)