рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!
рдХрд╛рд░реНрдп
рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░рдХреЗ рд╡рдВрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░рдЦрд╛рдирд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреНрд▓рдЧ рдЗрди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рддрд░реАрдХреЗ рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдлрд╝реИрдХреНрдЯрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП
class IFactoryBasic { public: IFactoryBasic() {} virtual ~IFactoryBasic() {} virtual Test* create(const QString &key, const QString &args)=0; };
рдЬрд╣рд╛рдВ
Test
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ
class Test { protected: QString _word; public: Test(const QString &word):_word(word) {} virtual ~Test() {} virtual void test(){ qDebug()<<"test "<<_word; } }; class TestChild: public Test { public: TestChild(const QString &word): Test(word) {} virtual void test() { qDebug()<<"test child"<<_word; } };
TestChild
-
Test
рдХреЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА
рджреЛрдиреЛрдВ рд╡рд░реНрдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░
word
рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо
test()
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛
рд╡рд┐рдзрд┐ рд╕рд░рд▓ рд╣реИред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлреНрд░реЗрдо рдмрдирд╛рдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
template<class T, class C, class A> class IFactory { QMap<QString, C* (T::*)(const A&) > handler; protected: void add(const QString &key, C *(T::*func)(const A &)) { handler[key]=func; } public: IFactory() {} virtual ~IFactory() {} C *make(const QString &key, const A &args) { if(handler.contains(key)) { T* inheritor = dynamic_cast<T*>(this); if(inheritor) return (inheritor->*handler[key])(args); } return 0; } };
рд╡рд░реНрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрдлреИрдХреНрдЯрд┐рд╡ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛред рдЕрдЧрд▓рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
IFactory
рдХреНрд▓рд╛рд╕ рдореЗрдВ
handler
рдПрдХ рдПрд╕реЛрд╕рд┐рдПрдЯрд┐рд╡ рдХрдВрдЯреЗрдирд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рдкреАрдврд╝реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ
C* (T::*)(const A&)
рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
C* (T::*)(const A&)
, рдЕрд░реНрдерд╛рдд, рд░рд┐рдЯрд░реНрди рдорд╛рди рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ
C
рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реЛрдЧрд╛, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рдХрд╛рд░
A
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрджрд░реНрдн рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
add(...)
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдХреБрдВрдЬреА-рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИ
<key,func>
рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЬреЛрдбрд╝реАред
make(...)
рдлрд╝рдВрдХреНрд╢рди рд╕реНрдкреЙрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ (рдкрд╣рд▓реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ
this
рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рд░рд┐рд╕ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЖрдк рдЙрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╣рд╛рдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рдереЗ)ред
рдпрд╣ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдлреНрд░реЗрдо рд╣реИ, рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ
class FactoryFst: public IFactory<FactoryFst, Test, QString>, public IFactoryBasic { Test *createOrigin(const QString &args){ return new Test(args); } Test *createChild(const QString &args) { return new TestChild(args); } public: FactoryFst() { add("test", &FactoryFst::createOrigin); add("testchild", &FactoryFst::createChild); } Test *create(const QString &key, const QString &args) { return make(key, args); } };
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╣рдо
IFactoryBasic
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдп рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
FactoryFst
рд╡рдВрд╢рдЬ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реМрдЯрд╛ рд╣реБрдЖ рдкреЙрдЗрдВрдЯрд░
Test
рдХреНрд▓рд╛рд╕ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдЧрд╛, рдФрд░
QString
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдк
Test
рдФрд░
TestChild
рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ:
Test *createOrigin(const QString &args){ return new Test(args); }
Test *createOrigin(const QString &args){ return new Test(args); }
- рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ
QString
рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реБрдП, рдЯрд╛рдЗрдк рдЯреЗрд╕реНрдЯ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
Test *createChild(const QString &args) { return new TestChild(args); }
Test *createChild(const QString &args) { return new TestChild(args); }
- рдЗрд╕реА рддрд░рд╣ рд╕реЗ
TestChild
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред
рд╡рд╣ рд╕рдм
IFactoryBasic
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░
IFactoryBasic
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ
create(...)
IFactoryBasic
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ
create(...)
рд╣реИред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛
рдпрд╣ рд╡рд┐рдзрд┐ рдЕрдзрд┐рдХ рд╕реАрдорд╛ рддрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред
рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдереЛрдбрд╝реА рддреИрдпрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХрд╛рд░рдЦрд╛рдиреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрд╣рд▓реЗ, рд╣рдо рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рддрд░реНрдХ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдЧреИрд░-рдорд╛рдирдХ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
class Arguments { public: virtual ~Arguments() {} }; template<class T> class TArguments: public Arguments { public: T arg; TArguments(T _arg):arg(_arg) {} };
Arguments
рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ, рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
TArguments
рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рд╣реИред
рд╣рдореЗрдВ
new
рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ-рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
class Container { public: virtual ~Container() {} virtual void *make( Arguments* ) = 0; };
рдПрдХ рдЧреИрд░-рдЯреЗрдореНрдкрд▓реЗрдЯ
Container
Arguments
рдХреЗ рд╕рдорд╛рди рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рддрд╛рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдХрд┐рд╕реА рднреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛
make(...)
рдлрдВрдХреНрд╢рди
make(...)
рдХрд╣ рд╕рдХреЗрдВред
make(...)
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдкрд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
template<class T, typename A> class TContainer: public Container { public: void *make(Arguments* args=0) { TArguments<A>* a = dynamic_cast< TArguments<A>* >( args ); if(!a) return 0; return new T(a->arg); } };
TContainer
рдХреНрд▓рд╛рд╕ рдкрд╣рд▓реЗ
TContainer
рд╣реА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреА рджрд▓реАрд▓реЗрдВ рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рд▓реМрдЯреЗ рдкреЙрдЗрдВрдЯрд░
T
рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
A
рдХрд╛ рддрд░реНрдХ рдЯрд╛рдЗрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
A
make(...)
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ,
Arguments
рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ TArguments рдХрд╛ рд╕реВрдЪрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рд╕рдлрд▓ рд░рд╣реЗ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдлрд╝реИрдХреНрдЯрд░реА рдлрд╝реНрд░реЗрдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
template<typename C=void, typename A=void> class TemplateFactory { QMap<QString, Container*> handler; public: TemplateFactory() {} virtual ~TemplateFactory(){ qDeleteAll(handler.values()); } template<class T> void add(const QString &name) { handler.insert(name, new TContainer<T, A>()); } C *make(const QString &name, const A &arg) { if(handler.contains(name)) return static_cast<C*>(handler.value(name)->make(new TArguments<A>(arg))); return 0; } };
рдпрд╣рд╛рдБ, рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ
C
, рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рд╣реИ,
A
рдЙрддреНрдкрдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рддрд░реНрдХ рд╣реИред
add(...)
рдлрд╝рдВрдХреНрд╢рди рд╕реВрдЪреА рдореЗрдВ рдирдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ,
make(...)
рдПрдХ рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рддрд░реНрдХ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ *
static_cast
рдЙрдкрдпреЛрдЧ
void*
рдкреНрд░рдХрд╛рд░ рдХреЛ
C*
рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛
C*
рд╣реИред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред
class FactorySnd: public TemplateFactory<Test, QString>, public IFactoryBasic { public: FactorySnd() { add<Test>("test"); add<TestCild>("testchild"); } Test* create(const QString &name, const QString &arg){ return make(name, arg); } };
рдПрдХрд╛рдзрд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
create(...)
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдХрдХреНрд╖рд╛рдПрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо
рджреЛрдиреЛрдВ рдлрд╝реИрдХреНрдЯрд░реА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдирд┐рдореНрди рдХреЛрдб рдЪрд▓рд╛рдХрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
IFactoryBasic* factory = new FactorySnd(); Test* test = factory->create("test", "A"); test->test(); test = factory->create("testchild", "B"); test->test(); delete factory; factory = new FactoryFst(); Test *stest = factory->create("test", "C"); stest->test(); stest = factory->create("testchild", "D"); stest->test();
рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдореЗрдВ рдирд┐рдореНрди рдирд┐рдХрд╛рд╕ рдорд┐рд▓рддрд╛ рд╣реИ:
test "A" test child "B" test "C" test child "D"
рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдХ рдФрд░ рдПрдХ рд╣реА рдХрд╛рд░реНрдп, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╕реНрддреБрдд рд╕рдорд╛рдзрд╛рди рдПрдХрдорд╛рддреНрд░ рдФрд░ рдЕрдЪреВрдХ рдирд╣реАрдВ рд╣реИрдВред рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдорд╣рд╛рди рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рджреЗрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рджреЗрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕реА рдкрджреНрдзрддрд┐ рдореЗрдВ рдЖрдк рдЗрд╕ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдпрджрд┐ рдпрд╣
QObject)
рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реИ
QObject)
рдпрд╛ рдЗрд╕реЗ рдСрдмреНрдЬрд░реНрд╡рд░ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬреЗрдирд░реЗрдЯрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕рдВрд╢реЛрдзрд┐рдд рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢реБрд▓реНрдХ рдПрдХ рдирдИ рдЙрддреНрдкрдиреНрди рд╡рд╕реНрддреБ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЛрдб рд░рдЦрд░рдЦрд╛рд╡ рд╣реИред рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдХрдо рдорд╛рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдЫреЛрдбрд╝рддреА рд╣реИред рдЕрд░реНрдерд╛рдд рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░рдЦрд╛рдиреЛрдВ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЖрд░рдВрднрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ, рдПрдХ рдирдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд╣реАрдВ рд╣реИ, (рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд▓рд╛рдЧреВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред