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