1. 程式人生 > >一個適用於任何繼承於QObject的類的建立工廠

一個適用於任何繼承於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”.根據需要還有一組不同的引數可以傳遞給建構函式。