一个适用于任何继承于QObject的类的创建工厂

 1 class ObjectFactory
 2 {
 3 public:
 4     template<typename T>
 5     static void registerClass()
 6     {
 7         constructors().insert( T::staticMetaObject.className(), &constructorHelper<T> );
 8     }
 9  
10     static QObject* createObject( const QByteArray& className, QObject* parent = NULL )
11     {
12         Constructor constructor = constructors().value( className );
13         if ( constructor == NULL )
14             return NULL;
15         return (*constructor)( parent );
16     }
17  
18 private:
19     typedef QObject* (*Constructor)( QObject* parent );
20  
21     template<typename T>
22     static QObject* constructorHelper( QObject* parent )
23     {
24         return new T( parent );
25     }
26  
27     static QHash<QByteArray, Constructor>& constructors()
28     {
29         static QHash<QByteArray, Constructor> instance;
30         return instance;
31     }
32 }; 

使用这种途径,不在需要使用Q_INVOKABLE声明构造器了,而且如果没有找到合适的构造器,只要这个类注册了,在constructorHelper()方法中就会报告一个编译错误。而且代码很容易使用:

1 ObjectFactory::registerClass<Foo>();
2  
3 // ...
4  
5 QObject* foo = ObjectFactory::createObject( "Foo" );

 同时也很容易修改这个代码,来适用于那些不从QObject继承的自定义抽象类,例如它可以使用任何传递给registerClass()方法或者自动从类的静态成员接收的类型的“Key”,而不是使用从OMetaObject接收的类名作为“Key”.根据需要还有一组不同的参数可以传递给构造函数。

posted @ 2018-10-15 14:01  辰‘心’闪烁  阅读(674)  评论(0编辑  收藏  举报