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;
}
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();
}
 

 
    
Top comments (0)