BaseClass * instance = BaseClass::factory()->build("derived_name");  template<class Base> class UnifiedFactory { public: UnifiedFactory(){} ~UnifiedFactory(){qDeleteAll(m_builders);} template<class T> void registerClass(const QString& name) { delete m_builders.value(name); m_builders.insert(name, new Builder<T>()); } Base * build(const QString& name) const { BaseBuilder * builder = m_builders.value(name); if(builder) return builder->build(); return 0; } private: class BaseBuilder { public: virtual Base * build() const = 0; }; template<class T> class Builder : public BaseBuilder { public: virtual Base * build() const { return new T(); } }; typedef QHash<QString, BaseBuilder*> Builders; Builders m_builders; }; .
, template registerClass(const QString& name), T - .
, -, BaseBuilder build() (!) Builder, .
- . , . , , .
.
, - .
#define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type)
, - template class AutoRegistrer, - - .
UF_REGISTER_DERIVED_NAMED , AutoRegistrer.
,
, :
class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1")
, , . - . , .
, Qt- , STL- .
, . , .
PS: ? .
, template registerClass(const QString& name), T - .
, -, BaseBuilder build() (!) Builder, .
- . , . , , .
.
, - .
#define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type)
, - template class AutoRegistrer, - - .
UF_REGISTER_DERIVED_NAMED , AutoRegistrer.
,
, :
class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1")
, , . - . , .
, Qt- , STL- .
, . , .
PS: ? . 
 ,     template registerClass(const QString& name),     T     -  . 
      ,       -,    BaseBuilder    build()  (!)  Builder,    . 
         - .             ,     .   ,    ,  . 
            . 
 
   ,     -            .    
 
  
 
 #define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type) 
 
       ,             - template class AutoRegistrer,    -       - . 
 
  UF_REGISTER_DERIVED_NAMED     ,       AutoRegistrer. 
      ,       
 
  
 ,      : 
 class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1") 
 
    
  ,     ,          .               -  .             ,    . 
  ,  Qt-   ,    STL- . 
            ,         .     ,       . 
 
 PS:     ?  . 
 ,     template registerClass(const QString& name),     T     -  . 
      ,       -,    BaseBuilder    build()  (!)  Builder,    . 
         - .             ,     .   ,    ,  . 
            . 
 
   ,     -            .    
 
  
 
 #define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type) 
 
       ,             - template class AutoRegistrer,    -       - . 
 
  UF_REGISTER_DERIVED_NAMED     ,       AutoRegistrer. 
      ,       
 
  
 ,      : 
 class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1") 
 
    
  ,     ,          .               -  .             ,    . 
  ,  Qt-   ,    STL- . 
            ,         .     ,       . 
 
 PS:     ? 
 . 
 ,     template registerClass(const QString& name),     T     -  . 
      ,       -,    BaseBuilder    build()  (!)  Builder,    . 
         - .             ,     .   ,    ,  . 
            . 
 
   ,     -            .    
 
  
 
 #define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type) 
 
       ,             - template class AutoRegistrer,    -       - . 
 
  UF_REGISTER_DERIVED_NAMED     ,       AutoRegistrer. 
      ,       
 
  
 ,      : 
 class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1") 
 
    
  ,     ,          .               -  .             ,    . 
  ,  Qt-   ,    STL- . 
            ,         .     ,       . 
 
 PS:     ? .
, template registerClass(const QString& name), T - .
, -, BaseBuilder build() (!) Builder, .
- . , . , , .
.
, - .
#define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type)
, - template class AutoRegistrer, - - .
UF_REGISTER_DERIVED_NAMED , AutoRegistrer.
,
, :
class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1")
, , . - . , .
, Qt- , STL- .
, . , .
PS: ? . 
 ,     template registerClass(const QString& name),     T     -  . 
      ,       -,    BaseBuilder    build()  (!)  Builder,    . 
         - .             ,     .   ,    ,  . 
            . 
 
   ,     -            .    
 
  
 
 #define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type) 
 
       ,             - template class AutoRegistrer,    -       - . 
 
  UF_REGISTER_DERIVED_NAMED     ,       AutoRegistrer. 
      ,       
 
  
 ,      : 
 class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1") 
 
    
  ,     ,          .               -  .             ,    . 
  ,  Qt-   ,    STL- . 
            ,         .     ,       . 
 
 PS:     ?  . 
 ,     template registerClass(const QString& name),     T     -  . 
      ,       -,    BaseBuilder    build()  (!)  Builder,    . 
         - .             ,     .   ,    ,  . 
            . 
 
   ,     -            .    
 
  
 
 #define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type) 
 
       ,             - template class AutoRegistrer,    -       - . 
 
  UF_REGISTER_DERIVED_NAMED     ,       AutoRegistrer. 
      ,       
 
  
 ,      : 
 class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1") 
 
    
  ,     ,          .               -  .             ,    . 
  ,  Qt-   ,    STL- . 
            ,         .     ,       . 
 
 PS:     ? 
 . 
 ,     template registerClass(const QString& name),     T     -  . 
      ,       -,    BaseBuilder    build()  (!)  Builder,    . 
         - .             ,     .   ,    ,  . 
            . 
 
   ,     -            .    
 
  
 
 #define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type) 
 
       ,             - template class AutoRegistrer,    -       - . 
 
  UF_REGISTER_DERIVED_NAMED     ,       AutoRegistrer. 
      ,       
 
  
 ,      : 
 class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1") 
 
    
  ,     ,          .               -  .             ,    . 
  ,  Qt-   ,    STL- . 
            ,         .     ,       . 
 
 PS:     ? .
, template registerClass(const QString& name), T - .
, -, BaseBuilder build() (!) Builder, .
- . , . , , .
.
, - .
#define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type)
, - template class AutoRegistrer, - - .
UF_REGISTER_DERIVED_NAMED , AutoRegistrer.
,
, :
class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1")
, , . - . , .
, Qt- , STL- .
, . , .
PS: ?.
, template registerClass(const QString& name), T - .
, -, BaseBuilder build() (!) Builder, .
- . , . , , .
.
, - .
#define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type)
, - template class AutoRegistrer, - - .
UF_REGISTER_DERIVED_NAMED , AutoRegistrer.
,
, :
class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1")
, , . - . , .
, Qt- , STL- .
, . , .
PS: ?.
, template registerClass(const QString& name), T - .
, -, BaseBuilder build() (!) Builder, .
- . , . , , .
.
, - .
#define UNIFIED_FACTORY(BaseType) \ static UnifiedFactory<BaseType>* factory() \ { \ static UnifiedFactory<BaseType> s_factory; \ return &s_factory; \ } \ template<class T> \ class AutoRegistrer \ { \ public: \ AutoRegistrer(const QString& name){factory()->registerClass<T>(name);} \ }; \ #define UF_REGISTER_DERIVED_NAMED(type, name) \ static const type::AutoRegistrer<type> type##Registrator(name); #define UF_REGISTER_DERIVED(type) UF_REGISTER_DERIVED_NAMED(type, #type)
, - template class AutoRegistrer, - - .
UF_REGISTER_DERIVED_NAMED , AutoRegistrer.
,
, :
class Base { publi: UNIFIED_FACTORY(Base) }; class Derived1 : public Base {...} UF_REGISTER_DERIVED(Derived1) class Derived2 : public Base {...} UF_REGISTER_DERIVED(Derived2) .... Base * instance = Base::factory()->build("Derived1")
, , . - . , .
, Qt- , STL- .
, . , .
PS: ?Source: https://habr.com/ru/post/147942/
All Articles